EasyData Documentation
Welcome to EasyData! This guide covers everything you need to know to organize and manage your data with AI assistance.
What is EasyData?
EasyData is an AI-assisted data management platform that helps you organize, store, and work with structured data. Whether you’re tracking customers, managing inventory, or organizing any kind of information, EasyData provides a flexible and intelligent way to handle your data.
Key Features
- AI-Assisted Schema Creation — Describe your data in plain language and let AI create the structure for you
- Smart Data Entry — Add entries manually or describe them in natural language
- Schema Relationships — Link your data together with references between schemas
- Formula Fields — Create computed fields with Excel-like expressions that update automatically
- Reports — Build dashboard-style data panels with aggregations, grouping, source filters, and formulas across your schemas
- Field Formats — Customize how data is displayed with formats like currency, email, phone, and more
- Smart Import — Import CSV, TSV, and Excel files with automatic section detection, editable field mapping, and optional AI smart detection
- Intelligent Search — Use embedded fields to enable AI-powered data lookup
- Export Options — Export your data to Excel, CSV, JSON, or Google Sheets, with larger exports handled in the background
Quick Start
Here’s how to get started in just a few steps:
1. Create Your First Schema
- Navigate to the Schemas page
- Click Create Schema
- Choose Assisted mode and describe your data (e.g., “A contact list with name, email, phone, and company”)
- Click Generate Schemas
- Review the generated schema and click Create Schemas
2. Add Some Data
Once your schema is created:
- Click on your schema to open it
- Click Add Manual Entry to add data using a form
- Or click Add with AI to describe your data in natural language
3. Organize with References
As your data grows, you can:
- Create additional schemas for related data (e.g., “Companies” for your contacts)
- Edit your original schema to add reference fields
- Link entries together for better organization
Schemas
Schemas are the foundation of EasyData. A schema defines the structure of your data — think of it as a template that describes what information you want to store and how it should be organized.
What is a Schema?
A schema is like a blueprint for your data. For example, if you want to track customers, your schema might include fields like:
- Name (text)
- Email (text with email format)
- Phone (text)
- Active (yes/no)
Once you create a schema, you can add entries (individual records) that follow this structure.
Creating Schemas
The Create schema dialog offers Assisted, Templates, and Manual tabs. The title stays the same when you change method. Assisted generation runs only when you choose Generate Schemas; review the proposed schemas before creating them.
AI-Assisted Creation
The fastest way to create a schema is to describe what you need in plain language:
- Click Create Schema from the schemas page
- Select the Assisted tab
- Describe your data structure in the text area
- Optionally attach a file for additional context (CSV, Excel, PDF, etc.)
- Click Generate Schemas
- Review the generated schema and make adjustments if needed
- Click Create Schemas to save
Example prompts:
- “A customer database with name, email, phone number, and company”
- “Track my book collection with title, author, genre, and rating”
- “Employee directory with name, department, hire date, and manager”
Templates
Templates give you a ready-made starting point for common workflows. A template can create one schema or a linked set of schemas with references already configured. Template-created schemas are normal schemas: you can edit their fields, add data, link them to projects, and delete them like any schema you create manually.
Some templates can also create a project to keep the related schemas together.
Manual Creation
For full control over your schema structure:
- Click Create Schema from the schemas page
- Select the Manual tab
- Click Add Schema to create a new schema card
- Enter the schema name
- Add fields using the Add Field button
- Configure each field’s properties
- Click Create Schemas to save
Field Properties
Each field has several configurable properties:
- Display Name — The human-readable name shown in the UI
- Type — Choose Text, Number, Yes/No, or Options for controlled lists
- Required — When enabled, entries cannot be saved without a value in this field
- Default Value — A pre-filled value for new entries
- Hide/Show — Fields can be hidden from the data grid without deleting them
- Format — Controls how data is displayed (e.g., currency, email, phone). See Field Formats
- Formula — An expression that computes this field’s value automatically. See Formula Fields
Schema Naming Rules
Schema names must follow these rules:
- Only letters, numbers, and spaces allowed
- Maximum 50 characters
- Cannot be empty
- No special characters (hyphens, underscores, etc.)
Valid names: “Customers”, “Product List”, “Tasks 2024”
Invalid names: “My-Schema”, “Products_v2”, “Tasks@Work”
Schema Relationships
One of EasyData’s powerful features is the ability to link schemas together using References.
What are References?
A reference field creates a link between two schemas. Instead of typing the same value repeatedly, you select from existing entries in another schema.
Example: You have two schemas:
- Categories: “Electronics”, “Clothing”, “Books”
- Products: Each product references a category
When adding a product, instead of typing “Electronics”, you select it from a dropdown of existing categories.
Creating a Reference Field
- Edit your schema
- Add a new field or edit an existing one
- In the Reference dropdown, select the schema you want to link to
- Choose a Display Field — this determines what text appears in the dropdown
Converting a Column to a Schema
If you have a field with many repeated values (like categories or statuses), you can convert it into a separate schema:
- Open your schema’s data grid
- Hover over the column header and click the database icon
- Enter a name for the new schema
- The unique values become entries in the new schema
- A new reference field is added to your schema, linking to the new schema
Your original field remains unchanged. This is useful for normalizing your data and avoiding typos in repeated values.
Field Formats
Field formats control how data is displayed and entered. They act as display hints — the underlying data type stays the same, but the UI adapts to show it in a more meaningful way.
Available Formats
| Format | Applies To | Description |
|---|---|---|
| Text fields | Displays as a clickable email link | |
| URL | Text fields | Displays as a clickable web link |
| Phone | Text fields | Formatted phone number display |
| Date | Text fields | Date picker (YYYY-MM-DD) |
| Date-Time | Text fields | Date and time picker |
| Time | Text fields | Time picker (HH:MM) |
| Currency | Number fields | Displays with currency symbol (e.g., $1,234.56) |
| Multiline | Text fields | Expands the input into a larger text area for longer content |
Setting a Format
- Edit your schema
- Select a field
- Choose a format from the Format dropdown
- Save the schema
Formula Fields
Formula fields let you create computed columns that calculate their values automatically based on other fields. Think of them like Excel formulas for your data.
How Formulas Work
When you add a formula to a field, that field becomes read-only — its value is computed every time a record is created or updated. You cannot manually edit a formula field.
Writing Formulas
Formulas reference other fields using the $ prefix with the field’s display name:
$quantity * $unitPrice Arithmetic: +, -, *, /, % (modulo)
Comparisons: ==, !=, >, <, >=, <=
Logical: AND, OR, NOT
Available Functions
| Function | Description | Example |
|---|---|---|
IF(condition, then, else) | Conditional logic | IF($stock > 0, "Available", "Out of stock") |
ROUND(value, decimals) | Round a number | ROUND($price * 1.16, 2) |
ABS(value) | Absolute value | ABS($balance) |
MIN(a, b) | Smaller of two values | MIN($price, $maxPrice) |
MAX(a, b) | Larger of two values | MAX($score, 0) |
FLOOR(value) | Round down | FLOOR($rating) |
CEIL(value) | Round up | CEIL($shipping) |
CONCAT(a, b, ...) | Join text | CONCAT($firstName, " ", $lastName) |
UPPER(text) | Uppercase | UPPER($code) |
LOWER(text) | Lowercase | LOWER($email) |
LEN(text) | Text length | LEN($description) |
TRIM(text) | Remove whitespace | TRIM($name) |
YEAR(date) | Extract year | YEAR($createdAt) |
MONTH(date) | Extract month | MONTH($createdAt) |
DAY(date) | Extract day | DAY($createdAt) |
DATEDIFF(date1, date2) | Days between dates | DATEDIFF($startDate, $endDate) |
Referencing Related Data
Formulas can access fields from referenced schemas using dot notation:
$product.price * $quantity Here $product is a reference field, and .price accesses the “price” field from the referenced schema.
Aggregation Functions
Aggregation functions compute values across all records in a related schema, filtered by a reference field pointing back to the current record. They are useful for “one-to-many” calculations like totaling all order lines for a customer.
| Function | Description | Example |
|---|---|---|
SUM("Schema", "field", "referenceField") | Sum a field across related records | SUM("OrderItems", "total", "orderId") |
COUNT("Schema", "referenceField") | Count related records | COUNT("OrderItems", "orderId") |
AVG("Schema", "field", "referenceField") | Average a field across related records | AVG("OrderItems", "total", "orderId") |
MIN("Schema", "field", "referenceField") | Minimum value across related records | MIN("OrderItems", "total", "orderId") |
MAX("Schema", "field", "referenceField") | Maximum value across related records | MAX("OrderItems", "total", "orderId") |
Arguments:
"Schema"— The name of the related schema (e.g., “OrderItems”)"field"— The field to aggregate (not needed for COUNT)"referenceField"— The reference field in the related schema that points back to the current schema (e.g., “orderId”)
Examples
| Use Case | Formula |
|---|---|
| Line total | $quantity * $unitPrice |
| Full name | CONCAT($firstName, " ", $lastName) |
| Tax amount | ROUND($subtotal * 0.16, 2) |
| Status label | IF($active, "Active", "Inactive") |
| Profit margin | ROUND(($revenue - $cost) / $revenue * 100, 2) |
| Days until due | DATEDIFF($today, $dueDate) |
| Order total | SUM("OrderItems", "lineTotal", "orderId") |
| Number of items | COUNT("OrderItems", "orderId") |
| Average item price | AVG("OrderItems", "unitPrice", "orderId") |
Classifications
Classifications organize your records into categories using rules you choose. Group transactions by amount, identify records that need attention, or organize dates into months. Use those categories to filter data and build reports without changing the original records.
Start with a built-in classification. Once you can see and filter its results, create your own rules or combine classifications into a breakdown.
- Apply your first classification
- Create your own rules
- Understand and correct results
- Build a breakdown and report
- Reuse rules and explore advanced options
- Troubleshooting
Apply your first classification
Our example answers a simple question: which transactions are small, medium, or large?
Use a separate practice schema with a date field named transactionDate, a text field named description, and a number field named amount. In the schema editor, use Text with the Date format for transactionDate. You need permission to manage classifications on the schema. Keep all amounts in the same currency; Amount bands does not convert currencies.
Download the four sample transactions as CSV. Import them into the practice schema, mapping the three columns to their matching fields. Check the Date format and Number type before importing. The file contains invented data and no classification results.
| transactionDate | description | amount | Expected band |
|---|---|---|---|
| 2026-01-05 | Coffee | 8 | 0 to less than 100 |
| 2026-01-12 | Office supplies | 100 | 100 to less than 1,000 |
| 2026-02-03 | Equipment | 1200 | 1,000 and above |
| 2026-02-08 | Transport | 40 | 0 to less than 100 |
- Open the practice schema and choose Manage classifications, then Apply definition.
- Name the application Transaction amount. Choose the built-in Amount bands definition and its published version.
- Map the Amount input to the schema’s
amountfield. This tells the reusable definition where to read its numbers. - Keep When no category matches set to Use definition default. Choose Validate, then Preview sample.
- Compare the preview category counts with the table above. The Record selector uses record IDs. Select an ID to read its Explanation, then use the saved classification column to compare categories with transaction descriptions.
- Choose Save schema application. Wait for Ready in Computation status; use Refresh to check progress.
- Return to the data table. Expand Classification columns and select Transaction amount to display the categories beside the source fields.
- In the column’s category filter, choose the band containing 100. Only Office supplies should remain. Clear the filter to see all four records again.
The generated labels use interval notation: [0, 100) includes 0 and excludes 100. [100, 1000) includes exactly 100. Negative amounts belong to a separate band below 0; they are not treated as positive spending. Labels can later be renamed without changing the boundaries.
If amount cannot be selected, check its field type. A text column containing numeric-looking values is not the same as a Number field.
Create your own rules
A definition contains reusable rules. A schema application connects a published definition to one schema’s fields. You may also see an application called a binding. Each application keeps its own results and selected published version.
Try a second classification called Purchase review. It will flag transactions of 100 or more for review.
- Open Classifications in the workspace sidebar and choose Create definition. Name it Purchase review and choose One category per record.
- Add one required input with key
amount, label Amount, accepted type Number, and cardinality Single value. - Choose generator type Rule and Add generator. Name its category Review. Set the condition to input Amount, operator Greater than or equal to, and fixed numeric value
100. - Add another Rule generator named Routine, with Amount Less than fixed numeric value
100. - Choose Save draft, Validate, and Publish saved draft. If validation reports an error, correct it and save again before publishing.
- Return to the practice schema and apply the published definition. Map its Amount input to
amount, validate, preview, and save as in the first tutorial.
Coffee and Transport should be Routine. Office supplies and Equipment should be Review. These are example business rules, so a negative amount would also be Routine with this particular definition.
In One category per record mode, the first matching enabled generator wins. Use Move up and Move down to set priority. For example, if you add an Equipment rule for amounts of 1,000 or more, place it above Review or the broader Review rule will win first.
Use Multiple categories per record when several labels should apply independently. In a separate definition, a Large purchase rule for amounts of 100 or more and an Equipment rule for amounts of 1,000 or more would both match the 1,200 transaction. A filter using Has every selected category finds records with both labels.
Understand and correct results
The automatic result comes from the rules. The effective result includes manual corrections and category curation. Filters and reports use effective results.
To practice a correction, select Coffee in the data table and choose Correct selected records for Purchase review. Assign it to Review, apply the correction, and wait for computation to finish. Coffee should now be Review although its amount is still 8. Choose Return to automatic and apply the correction to restore Routine.
Manual corrections survive rule changes until you return the record to automatic. With multiple categories per record, Force include adds a category and Force exclude removes one. Other categories keep their existing corrections. Review the selected-record count before applying a bulk correction.
Leave unclassified intentionally clears an exclusive assignment. It does not delete the source record. For records that simply match no rule, the definition or application can leave them without a category or assign an explicit Unclassified fallback category. An intentional manual clear suppresses that fallback.
| Status | What to expect |
|---|---|
| Queued or Computing | Work is pending or running. Previous completed results may remain visible. |
| Ready | A completed result is available. |
| Ready with errors | Computation finished, but some records had errors. Inspect the run details. |
| Stale | Data or configuration changed since the displayed results. Wait for the new computation before checking totals. |
| Failed | Inspect the error, correct its cause, and choose Recompute / retry. A previous successful result may still be available. |
| Not computed | There is no completed result to display yet. |
For a surprising result, check the mapped field, the record’s preview explanation, generator priority, and any manual correction. Also check whether you are seeing the last completed results while an update runs.
Build a breakdown and report
A breakdown organizes several classifications into levels. For example, Year-month → Amount band answers: how much did we spend in each amount band within each month?
- Apply the built-in Year-month definition to the practice schema. Map its date input to
transactionDate, name the application Transaction month, validate, preview, and save. Wait for both Transaction month and Transaction amount to be Ready. - Open Manage classifications, then Breakdowns. Select the practice schema as the source and choose New breakdown.
- Name it Monthly spending. Add Transaction month as level 1 and Transaction amount as level 2. Keep both evaluation scopes at Each record and leave Parent categories empty to include every month.
- Choose Validate, inspect Preview, then Save breakdown. Wait for the saved breakdown’s computation to complete.
- In a report using the practice schema, select the saved Monthly spending breakdown as the grouping dimension. Use depth 1 for months or 2 for month and amount band. Sum the
amountfield.
At depth 1, January 2026 totals 108 and February 2026 totals 1,240. Together they total 1,348.
At depth 2, expect these four groups. Office supplies follows January 2026 → 100 to less than 1,000.
| Month | Amount band | Records | Sum of amount |
|---|---|---|---|
| January 2026 | 0 to less than 100 | 1 | 8 |
| January 2026 | 100 to less than 1,000 | 1 | 100 |
| February 2026 | 0 to less than 100 | 1 | 40 |
| February 2026 | 1,000 and above | 1 | 1,200 |
Use Year-month when January in different years must stay separate. Calendar month combines the same month of the year across years. A breakdown preview is a sample, so verify report totals against completed results, not preview counts.
Reuse rules and explore advanced options
Published versions. Save draft keeps work in progress. Publish creates an immutable version. Applying a definition selects that version; later publication does not silently switch existing applications. The current application editor lets you change mappings and parameters but locks the definition and version. To try another published version through this editor, create another application and compare its results before changing filters or reports that use the earlier one.
Reuse across schemas. Apply the same published definition to another schema and map its inputs there. For example, Amount can read amount in Transactions and total in Orders. Parameters are settings supplied for an application; inputs are the values evaluated from its records. Copy a built-in to your workspace when you need to edit its rules.
Category management. Open a saved application to review its categories. Edit labels, descriptions, colors, and order without editing source records. Generated categories can be admitted automatically, held for review, or routed to Other. Hiding a category controls presentation; it is not a manual correction. Merging maps source categories to a target while preserving their source keys. Check the impact first, especially when records belong to both categories.
Different generators answer different questions:
| Generator | Example |
|---|---|
| Rule | Review when amount is at least 100 |
| Distinct values | One category for each transaction type |
| Date parts | Year-month from a transaction date |
| Number ranges | Fixed amount bands with explicit boundaries |
| Normalized text | Trim spaces and normalize case before grouping merchant names |
| Pattern capture | Extract a supported pattern from a text value |
| List expansion | Add several categories from a list; requires multiple-category mode |
| Expression | Calculate a category value from inputs and parameters |
Pattern capture uses a restricted pattern syntax; consult the editor’s help before pasting a regular expression. List expansion does not imply that any schema field can supply a list. Use a supported mapping and validate it. For date and time inputs, review the timezone parameter because a timestamp can fall on different calendar dates in different timezones.
Contextual breakdowns. Choose the evaluation scope according to the question:
| Scope | Example question | What changes |
|---|---|---|
| Each record | Which fixed amount band contains this transaction? | The same boundaries apply in every month. |
| Inside each parent bucket | Which transaction types have the highest total in each month? | Top values are ranked separately within each month. Quantiles likewise calculate thresholds from each parent’s records. |
| The parent bucket itself | Is this month’s total at least 1,000? | The classification receives the month’s aggregate instead of each individual amount. |
For the last example, use Sum of amount and map the aggregate to Purchase review’s amount input. Both month totals meet that definition’s Review threshold of 100. A separate rule with a 1,000 threshold would distinguish January’s 108 from February’s 1,240. Saved contextual results are needed to inspect actual rankings and thresholds; a small preview cannot establish them.
Templates. A template reuses a breakdown structure with published component versions and input mappings. Start with a working breakdown before learning templates. Copying or forking creates independent definitions or templates; it does not automatically apply them to a schema. Review the mapping and version changes before instantiating or upgrading a template.
Exports. Add classifications as category labels or stable keys; overlapping classifications also support one column per category. Exports retain a snapshot of category names and memberships. Wait for current results when you need an up-to-date export. See Export data for the export workflow.
Troubleshooting
| Problem | Check |
|---|---|
| The classification column is missing | Expand Classification columns and select the application. If no applications exist yet, save one first. |
| A definition is missing from the version selector | A draft must be published before it can be applied. |
| A record is in the wrong category | Check input mapping, rule priority, manual corrections, and computation status. |
| Edited rules did not change existing results | Existing applications still use their selected published version. |
| A result has no category | Check unmatched behavior, empty or invalid input, pending generated-category review, and manual clearing. |
| Group totals exceed the original total | A record may belong to more than one category or breakdown path. |
| January combines several years | Use Year-month instead of Calendar month. |
| Preview and the saved report differ | Preview is sampled; the report uses saved results and its own filters. Check both freshness and filters. |
For the first tutorial, your final check is four source records totaling 1,348, with Office supplies in the band starting at 100. The classifications add categories; the source dates, descriptions, and amounts remain unchanged.
Reports
Opening a report from the sidebar or a report card shows Results. This reads the existing results; it does not save a definition or start AI generation. Use Definition to change its name, fields, formulas, grouping or source filters. Schema links open Data, and project links open their contents. The object name stays visible when you switch between content and definition.
Reports let you create data panels that aggregate and summarize data across your schemas. They can show a single row of totals (ungrouped) or break data down into multiple rows using Group By (grouped). Think of them as live dashboards for your data.
What is a Report?
A report is a collection of fields — either static values you enter manually or formulas that compute automatically from your schema data. Reports can also group results by a field, giving you breakdowns like revenue per month or orders by status.
For example, an “Order Summary” report might show:
- Total Revenue —
SUM("Sales", "amount") - Number of Orders —
COUNT("Orders") - Average Order —
AVG("Sales", "amount") - Tax Rate — 0.16 (a static value)
- Estimated Tax —
$totalRevenue * $taxRate
Creating a Report
- Navigate to the Reports page
- Click New report
- Enter a name for your report
- Add fields — choose between Value (static) or Formula (computed)
- Optionally configure Group By to break results into rows
- Click Save
Report Fields
Each field in a report has these properties:
- Display Name — The label shown in the report table
- Type — Either “Value” (manual input) or “Formula” (auto-computed)
- Value — For value fields, the number you enter
- Formula — For formula fields, the expression to compute
- Format — How to display the result (number, currency, or percentage)
Report Formulas
Report formulas use the same syntax as schema formulas but with a key difference: aggregation functions operate on all records globally (or within each group when Group By is configured).
Schema Aggregations
| Function | Description | Example |
|---|---|---|
SUM("Schema", "field") | Sum a field across records | SUM("Sales", "amount") |
COUNT("Schema") | Count records in a schema | COUNT("Orders") |
AVG("Schema", "field") | Average a field across records | AVG("Products", "price") |
MIN("Schema", "field") | Minimum value across records | MIN("Sales", "amount") |
MAX("Schema", "field") | Maximum value across records | MAX("Sales", "amount") |
Local Field References
Reference other fields within the same report using $:
$totalRevenue * $taxRate Group By
Group By lets you break a report into multiple rows based on a field from one of your schemas. For example, grouping by a date field with month granularity shows one row per month.
- Schema — The schema to group by
- Field — Which field to use as the group key
- Granularity — For date fields, choose day, month, or year
You can group by multiple fields to create composite breakdowns (e.g., revenue by product and month).
Source Filters
Grouped reports can filter the source records before calculating results. Source filters use the same kind of field/operator/value rules as schema filters, but they apply only to the report’s source schema.
For example, a monthly revenue report can include only records where Status equals “Paid”, or an inventory report can group only products where Active is checked. When a grouped report has source filters, the filters affect the rows, totals, and exports for that report.
Linking Reports to Schemas
You can display reports alongside your schema data:
- Open a schema’s data grid
- Click Link reports in the toolbar
- Select which reports to link
- Save your selection. Linked reports appear below your data grid; their titles link to the report Results page.
This is useful for seeing totals and breakdowns in context while browsing your data.
Examples
| Use Case | Formula | Group By |
|---|---|---|
| Total revenue | SUM("Sales", "amount") | — |
| Monthly revenue | SUM("Sales", "amount") | Sales → date (month) |
| Order count by status | COUNT("Orders") | Orders → status |
| Average order value | SUM("Sales", "amount") / COUNT("Sales") | — |
| Tax amount | SUM("Sales", "amount") * $taxRate | — |
Public API
EasyData’s Public API lets server-side integrations list schemas, read or write records, prepare AI-assisted record creates, and start one-time AI credit checkouts without using the web app.
API Keys
Create and revoke keys from Settings → Developer access → API Keys. Keys are shown once as ed_sk_... secrets. EasyData stores only a hash and identifies keys later by their visible prefix.
Scopes:
- Read only — list schemas, fetch schemas, query records, fetch one record, list credit packages, and check a credit purchase
- Read and write — all read actions plus create schemas, create, update, or delete records, AI-assisted record creation, and starting a credit checkout
Base URL and Auth
Use the /api/public/v1 namespace and send the key as a bearer token:
curl -s "https://easydata.cc/api/public/v1/schemas"
-H "Authorization: Bearer $EASYDATA_API_KEY" Use /api/public/v1/named when you want request and response payloads keyed by field names.
curl -s "https://easydata.cc/api/public/v1/named/schemas"
-H "Authorization: Bearer $EASYDATA_API_KEY" Field IDs and Field Names
The stable API at /api/public/v1 uses immutable field IDs such as f1, f2, and f3. Schema responses include field names and display names so your integration can map labels to stable IDs.
The named API at /api/public/v1/named uses each field’s internal name, such as customerName, in records, filters, and sorting. Records are returned as flat objects, with f1 returned as id. Reference field values remain UUID strings, and related lookup records are also returned with field-name keys.
For retry-safe creates, server integrations may provide deterministic UUIDs. Schema creation keeps a non-empty id, field-ID record creation keeps a valid f1, and named record creation keeps id. Reusing an existing schema or record ID returns 409 Conflict.
For network retries, send an optional Idempotency-Key header on public POST writes: schema create, record create, named record create, and Smart Create. EasyData scopes the key to the API key, method, path, and request body. The same key with the same request replays the stored successful JSON response; the same key with a different request returns 409 Conflict. Failed requests are not cached.
Credit purchases use the UUID requestId in the request body for retry safety. Reuse it only for the identical package purchase. The API returns a Paddle checkoutUrl; the purchase is not complete until the user finishes checkout and its status becomes completed.
Recent Public API requests are visible in Settings → Developer access → API Keys. Logs include method, path, status, duration, request body, and response body for debugging integrations. Authorization headers and raw API key secrets are never stored. Very large bodies are capped and marked as truncated.
Named schema responses return fields as an array with each field’s id, name, displayName, type, and other metadata. If a schema has duplicate field names, use the field-ID API or rename the fields before using the named API.
When creating schemas through the named API, include targetSchemaId on a field to make it a reference field. References always point to the target record id.
Endpoints
Field-ID endpoints:
| Method | Path | Scope |
|---|---|---|
| GET | /api/public/v1/schemas | Read |
| POST | /api/public/v1/schemas | Read and write |
| GET | /api/public/v1/schemas/{schemaId} | Read |
| POST | /api/public/v1/schemas/{schemaId}/records/query?limit=&offset= | Read |
| GET | /api/public/v1/schemas/{schemaId}/records/{recordId} | Read |
| POST | /api/public/v1/schemas/{schemaId}/records | Read and write |
| PATCH | /api/public/v1/schemas/{schemaId}/records | Read and write |
| DELETE | /api/public/v1/schemas/{schemaId}/records | Read and write |
| POST | /api/public/v1/smart-entry/create | Read and write |
Named endpoints:
| Method | Path | Scope |
|---|---|---|
| GET | /api/public/v1/named/schemas | Read |
| POST | /api/public/v1/named/schemas | Read and write |
| GET | /api/public/v1/named/schemas/{schemaId} | Read |
| POST | /api/public/v1/named/schemas/{schemaId}/records/query?limit=&offset= | Read |
| GET | /api/public/v1/named/schemas/{schemaId}/records/{recordId} | Read |
| POST | /api/public/v1/named/schemas/{schemaId}/records | Read and write |
| PATCH | /api/public/v1/named/schemas/{schemaId}/records | Read and write |
| DELETE | /api/public/v1/named/schemas/{schemaId}/records | Read and write |
Credit purchase endpoints:
| Method | Path | Scope |
|---|---|---|
| GET | /api/public/v1/credit-products | Read |
| POST | /api/public/v1/credit-purchases | Read and write |
| GET | /api/public/v1/credit-purchases/{purchaseId} | Read |
Before creating a credit purchase, show the available package and price to the user and get explicit confirmation. Send { "productId": 1, "requestId": "<uuid>" }, then give the returned checkoutUrl to the user. The user completes payment directly through Paddle Checkout.
Named Curl Examples
Create a schema with field names:
curl -s -X POST "https://easydata.cc/api/public/v1/named/schemas"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Idempotency-Key: schema-orders-001"
-H "Content-Type: application/json"
-d '{"schemas":[{"id":"018f7f37-78a2-7000-9000-000000000101","name":"Orders","description":"Customer orders","displayField":"customerName","fields":[{"name":"customerName","type":"string","displayName":"Customer Name"},{"name":"amount","type":"number","displayName":"Amount"}],"embeddedFields":["customerName"]}]}' Query records with field names:
curl -s "https://easydata.cc/api/public/v1/named/schemas/$SCHEMA_ID/records/query?limit=50&offset=0"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Content-Type: application/json"
-d '{"filters":{"fields":[{"field":"customerName","conditions":[{"operator":"contains","value":"Ada"}],"logic":"and"}],"logic":"and"},"orderBy":[{"field":"customerName","direction":"asc"}]}' Create records with field names:
curl -s -X POST "https://easydata.cc/api/public/v1/named/schemas/$SCHEMA_ID/records"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Idempotency-Key: order-018f7f37-201"
-H "Content-Type: application/json"
-d '{"records":[{"id":"018f7f37-78a2-7000-9000-000000000201","customerName":"Example customer","amount":42}]}' Update records with field names:
curl -s -X PATCH "https://easydata.cc/api/public/v1/named/schemas/$SCHEMA_ID/records"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Content-Type: application/json"
-d '{"records":[{"id":"$RECORD_ID","data":{"customerName":"Updated customer"}}]}' Delete records:
curl -s -X DELETE "https://easydata.cc/api/public/v1/named/schemas/$SCHEMA_ID/records"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Content-Type: application/json"
-d '{"ids":["$RECORD_ID"]}' Field-ID Curl Examples
Create a schema with field IDs:
curl -s -X POST "https://easydata.cc/api/public/v1/schemas"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Idempotency-Key: schema-orders-001"
-H "Content-Type: application/json"
-d '{"schemas":[{"id":"018f7f37-78a2-7000-9000-000000000101","name":"Orders","description":"Customer orders","fields":{"f1":{"name":"id","type":"string","order":0,"displayName":"ID"},"f2":{"name":"customerName","type":"string","order":1,"displayName":"Customer Name"},"f3":{"name":"amount","type":"number","order":2,"displayName":"Amount"}},"primaryKey":["f1"],"uniqueKeys":[],"foreignKeys":[],"embeddedFields":["f2"]}]}' Query records:
curl -s "https://easydata.cc/api/public/v1/schemas/$SCHEMA_ID/records/query?limit=50&offset=0"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Content-Type: application/json"
-d '{"filters":{"fields":[],"logic":"and"},"orderBy":[]}' Create records:
curl -s -X POST "https://easydata.cc/api/public/v1/schemas/$SCHEMA_ID/records"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Idempotency-Key: record-018f7f37-201"
-H "Content-Type: application/json"
-d '{"records":[{"f1":"018f7f37-78a2-7000-9000-000000000201","f2":"Example value","f3":42}]}' Create records with AI:
curl -s -X POST "https://easydata.cc/api/public/v1/smart-entry/create"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Idempotency-Key: smart-order-acme-001"
-H "Content-Type: application/json"
-d '{"message":"Add an order for Acme for 2400 due tomorrow","schemaIds":["$SCHEMA_ID"],"autoSave":false}' schemaIds is optional but recommended when your integration already knows the target schema. With autoSave: false, EasyData returns proposed records using field IDs. With autoSave: true, EasyData saves create-only results through the same validation, history, formula, embedding, report, and record-count behavior as the records API.
Update records:
curl -s -X PATCH "https://easydata.cc/api/public/v1/schemas/$SCHEMA_ID/records"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Content-Type: application/json"
-d '{"records":[{"id":"$RECORD_ID","data":{"f2":"Updated value"}}]}' Delete records:
curl -s -X DELETE "https://easydata.cc/api/public/v1/schemas/$SCHEMA_ID/records"
-H "Authorization: Bearer $EASYDATA_API_KEY"
-H "Content-Type: application/json"
-d '{"ids":["$RECORD_ID"]}' V1 intentionally does not include schema editing, imports, full Smart Entry continuation flows, reports, widgets, or browser/public keys.
Connect AI Agents
EasyData lets AI agents connect to a user’s account without asking the user to copy an API key. The agent registers as a public OAuth client, the user signs in and approves access, and EasyData issues credentials limited to the approved resource and scope.
Clients and User Connections
A client_id identifies the agent application, not an EasyData user. It is a public identifier and is safe to include in authorization requests. One client can connect to multiple users, but every user must approve a separate grant and receives a separate access-token and refresh-token family.
Each active connection is unique to a user, client, and resource. Users can review and immediately revoke their grants from Settings → Integrations & agents → Connected Agents.
Authorization Flows
| Flow | How the user approves | Best for |
|---|---|---|
| Authorization Code + PKCE | The agent opens EasyData in a browser and receives a one-time code through its registered redirect URI | Web, desktop, and mobile clients |
| Service-auth claim | The agent shows a verification URL and six-digit code, then polls while the user signs in and confirms separately | CLI, chat, and background agents |
Both flows create the same kind of connection and issue the same token types. Authorization codes and claim tokens are short-lived, single-use intermediates; they cannot call the API themselves.
Resources, Scopes, and Tokens
- REST resource —
https://easydata.cc/api/public/v1 - MCP resource —
https://easydata.cc/api/mcp - Read — list or get schemas, query or get records, list credit packages, and check credit purchases
- Read and write — all read actions plus schema creation, record writes and deletes, Smart Entry, and starting a confirmed credit checkout
Access tokens are signed bearer tokens valid for one hour. Refresh tokens are opaque credentials valid for up to 30 days and rotate on every use. Store access and refresh tokens as secrets. Reusing a refresh token after it has rotated revokes the entire connection.
Discovery and Integration
Agents should start with EasyData’s machine-readable discovery documents instead of hard-coding endpoint details:
- OAuth authorization-server metadata
- Protected-resource metadata
- Agent authentication guide
- Agent Skills index
- MCP Streamable HTTP endpoint:
/api/mcp
For example, an agent can discover every OAuth endpoint with:
curl -s "https://easydata.cc/.well-known/oauth-authorization-server" The client registration response returns a client_id. The agent stores and reuses that public identifier, but stores each user’s refresh token separately and never exposes tokens in URLs, browser bundles, logs, or chat.
Embedded Fields
Embedded fields enable a powerful AI feature: when you add entries using the AI assistant, it can search and reference your existing data.
What are Embedded Fields?
When you mark a field as “embedded”, its values are indexed in a vector database. This allows the AI to find relevant entries when you describe data in natural language.
How It Works
- You mark fields like “Name” or “Email” as embedded in your schema
- The system syncs these values to the search index (you’ll see a sync status indicator)
- When adding entries via AI, you can reference existing data naturally
Example:
You have a “Contacts” schema with “Name” marked as embedded, containing an entry for “John Smith”.
When adding a task, you can say: “Create a follow-up task for John”
The AI will:
- Search your embedded fields for “John”
- Find “John Smith” in your Contacts
- Automatically link the task to the correct contact
Good Candidates for Embedding
Choose fields that help identify entries:
- Names (person names, product names, company names)
- Email addresses
- Descriptions
- Titles
Enabling Embedded Fields
- Edit your schema
- Find the field you want to embed
- Toggle the Embedded switch
- Save the schema
- Wait for the sync to complete
Managing Data
Once you’ve created a schema, you can start adding and managing data entries.
Viewing Your Data
Click a schema card or sidebar schema name to open Data. This spreadsheet-like interface shows your records. Choose Definition to configure fields, types, formulas and references; choose Data to return to the records.
Adding Entries
Manual Entry
For precise control over your data:
- Click Add Manual Entry in the toolbar
- A new empty row appears at the top of the grid
- Fill in each field by clicking the cells
- Press Enter to save and create another entry, or Escape to cancel
AI-Assisted Entry
Let AI help you convert natural language into structured data:
- Click Add with AI in the toolbar
- Describe your data in plain language
- Review the converted data in the preview
- Click to add the entries to your schema
Example prompts:
- “Add a customer named John Smith, email [email protected], phone 555-1234”
- “Create three products: Widget A for $19.99, Widget B for $29.99, Widget C for $39.99”
- “Add a task to follow up with the marketing team about the Q1 report”
You can also use voice input by clicking the microphone icon.
Importing Files
For existing spreadsheets or tabular files:
- Open the schema you want to import into
- Click Import in the toolbar
- Upload a CSV, TSV, XLS, or XLSX file
- Review the detected file section and column-to-field mapping
- Adjust any mapped fields or skip columns you do not want to import
- Click Import to create the records
EasyData automatically detects the best importable section in the file and suggests a mapping from file columns to schema fields. This helps with spreadsheets that have extra headings, blank rows, multiple regions, or field/value layouts instead of a simple table.
If the detected section or mapping does not look right, use Smart detect with AI from the review step. Smart detection uses AI credits to choose the best section and mapping for the selected schema, then returns you to the same review screen so you can confirm before importing.
You can also attach tabular files while using Add with AI. When EasyData detects that an uploaded file is better handled as an import, it shows an import review offer so you can inspect the mapping before records are created.
Editing Entries
Inline Editing
The fastest way to edit data:
- Click on any cell in the data grid
- Type the new value
- Press Enter to save, Tab to move to the next cell, or Escape to cancel
Changes are saved automatically when you leave a cell.
Reference Fields
When editing a reference field:
- Click the cell to open a dropdown
- Search or scroll to find the entry you want
- Click to select it
Filtering and Sorting
Sorting
Open Sort in the toolbar to choose a column and ascending or descending order, or clear the sort. Its count shows the active sort rules. The column chevron also offers Sort and filter as a shortcut.
Filtering
Use the filter options to narrow down your data:
- Open Filter in the toolbar, or Sort and filter from a column’s chevron
- Select the field and an operator (equals, contains, greater than, etc.)
- Enter the filter value
- Apply the filter. The toolbar count shows fields with active filters
Filtering and sorting affect the current table. Save a filter when you want to reuse it. Imported-file chips are shown separately because they identify the source of imported records.
Available filter operators:
| Operator | Description | Example |
|---|---|---|
| Equals | Exact match | Status = “Active” |
| Not Equals | Excludes value | Status ≠ “Archived” |
| Contains | Partial text match | Name contains “John” |
| Starts With | Text prefix | Email starts with “admin” |
| Ends With | Text suffix | Email ends with “@company.com” |
| Greater Than | Numeric comparison | Price > 100 |
| Less Than | Numeric comparison | Quantity < 10 |
| Is Null | Empty values | Notes is null |
| Is Not Null | Has a value | Email is not null |
Configure View
Open View options in the schema toolbar for presentation controls:
- Column visibility and order opens a draft in the grid. Add or hide columns, drag to reorder, then choose Apply to save or Cancel to discard.
- Density and column widths apply immediately and stay in this browser.
- Conditional coloring uses Save to store your rules. Column visibility/order and conditional rules are personal settings for this account, workspace and schema.
- Cell colors change shared record metadata immediately, so other people with access to those records can see them.
When you have reference fields, you can add columns from the referenced schema to display related data inline. Definition controls the schema’s fields and types; hiding a view column does not remove its field or records. Saved filters retain their existing behavior and do not save a complete view.
Export Data
Export your data in multiple formats for sharing, backup, or integration with other tools.
Export Formats
| Format | Description |
|---|---|
| Excel (.xlsx) | Spreadsheet with smart formatting — dates, clickable URLs, and email links are formatted automatically |
| CSV | Plain text comma-separated values, compatible with any spreadsheet app |
| JSON | Structured data format, ideal for developers and integrations |
| Google Sheets | Creates a new spreadsheet directly in your Google account (requires connecting your Google account in Settings) |
How to Export
- Open a schema’s data grid
- Click Export Data in the toolbar
- Select your preferred format
- Small exports are created immediately
- Larger exports are processed in the background and appear in the export tray when ready
- For Google Sheets, the completed export provides a link to the new spreadsheet
What Gets Exported
- All visible columns in your current view configuration
- Reference fields are resolved to show actual values (e.g., product names instead of IDs)
- Active filters and sort order are applied to the export
- Report exports follow the report’s grouping and source filters
- Background export files are available from the export tray for a limited time
Edit History
EasyData tracks all changes to your entries:
- Click History in the toolbar (clock icon)
- View a timeline of all changes
- See what was changed and when
- View before/after values for each edit
For each change, you can see:
- Timestamp — When the change occurred
- Operation — Create, Update, or Delete
- Entry ID — Which entry was affected
- Changed Fields — Which fields were modified
- Before/After Values — The old and new values
Data Validation
EasyData validates your entries based on the schema definition:
- Required Fields — Must have a value before saving
- Type Validation — Values must match the field type (numbers, booleans, etc.)
- Format Validation — Email and URL formats are checked
When possible, EasyData automatically converts values (e.g., empty strings in number fields become null, “true”/“false” strings convert to booleans).
Tips for Success
Start Simple
Begin with a basic schema and add complexity as needed. You can always add new fields or create relationships later.
Use AI Assistance
Don’t hesitate to use the AI features! Whether creating schemas or adding data, describing things in plain language often saves time.
Leverage References
Instead of typing repeated values (like categories or statuses), create a separate schema and use references. This prevents typos and makes updates easier.
Enable Embedded Fields
For schemas you’ll reference frequently (like Contacts or Categories), enable embedded fields on identifying information. This makes AI-assisted entry much more powerful.
Export Regularly
Use the Export feature to back up your data or share it with others in Excel format.
Classifications and breakdowns
A classification owns its grouping structure, rules, and calculations. Open Edit classification to change a grouping’s field or rules directly, reorder it, or adjust its conditions. Review the preview, then choose Save classification. Changes apply only to that classification.
Choose Use on another schema to create an independent copy. Select the destination schema and map each input to one of its fields. Matching field names and types are suggested; review them before saving. The copy keeps the rules and calculations, but has its own source mappings. It does not copy records or manual result corrections, and later edits do not update the original.
Single-schema creation prepares the mappings automatically. Sources and field mappings lets you review them or configure multiple sources. Required inputs must have a compatible mapping; optional inputs may explicitly be empty.
All classifications let you edit grouping rules and fields inline, including classifications used by reports. Advanced scopes, calculations, category customizations and manual corrections stay connected. Editing a shared grouping creates an independent copy for that classification. Template-based classifications retain their explicit upgrade options.
A classification definition contains reusable rules and generators. A schema application, also called a binding, maps its inputs to fields in one schema and pins a published version. Editing a draft does not change existing applications. Validate the draft before publishing, then update each application explicitly when ready.
For a bank statement, map the Amount input to the amount field and apply Amount bands. Apply Calendar month to the transaction date to group January through December. Year-month keeps January in different years separate. Rule categories can distinguish business transactions from personal transactions using conditions on the merchant or description.
One category per record selects the first matching category. Move up and Move down buttons set the priority and work with the keyboard. Multiple categories per record can classify one transaction as both Business and Tax deductible. A filter using All selected categories finds transactions that have both tags.
Generated categories come from the source values. You can change their labels, description, color, and order without changing source records. Hiding a category affects presentation. Merging categories combines their meaning; overlapping record counts can include the same record twice. Use the displayed impact before applying a merge.
Manual assignment changes the effective classification of selected records. For overlapping categories, include and exclude control each category separately. These corrections survive rule updates until you choose Return to automatic. Leave unclassified intentionally removes an exclusive assignment. Unclassified means no effective category, rather than a missing source record.
A breakdown composes classifications into a tree, for example Month → Amount band → Transaction category. A record-scope node evaluates each record using its existing classification. Parent-partition scope recomputes thresholds or rankings within the parent bucket, so per-month quantiles can differ from fixed amount bands. Parent-group scope classifies an aggregate, such as the monthly total, rather than each transaction. A record sample does not represent the full population needed for contextual thresholds.
Reports can group by a field, classification, or saved breakdown at a selected depth. Overlapping totals are not additive. A transaction included in two categories contributes to both groups. Adding group totals can exceed the original schema total. Reference fields retain their usual display labels.
Preview shows a bounded sample and never saves computed results. Ready means an active generation is available. Stale means the source or rules changed since that generation. Computing keeps the previous successful results visible until the new run succeeds. If computation fails, inspect the bounded error summary and retry after correcting the cause.
Templates reuse a breakdown structure and pin a version. Review input mappings and an upgrade preview before applying an upgrade. Forking creates an independent template. A copied definition or template needs its own schema applications.
Reuse a classification
Choose Use on another schema, select the destination for each source or related schema, and map its fields. Check mappings validates the entire classification before Create independent copy. This includes conditional branches, rankings, calculated ranges, expressions, group totals and named calculations.
The copy keeps category labels, hidden categories, merges and hierarchy. It calculates new results from the destination records. Existing reports, run history and record-specific corrections remain with the original classification. Editing either classification does not change the other.