Export
Export protocol schemas
Data Export & Import Protocol
Defines schemas for streaming data export, import validation, template-based field mapping, and scheduled export jobs.
Industry alignment: Salesforce Data Export, Airtable CSV Export, Dynamics 365 Data Management.
Base path: /api/v1/data/{object}/export
Source: packages/spec/src/api/export.zod.ts
TypeScript Usage
import { CreateExportJobRequestSchema, CreateExportJobResponseSchema, CreateImportJobRequestSchema, CreateImportJobResponseSchema, DeduplicationStrategy, ExportFormat, ExportImportTemplateSchema, ExportJobProgressSchema, ExportJobStatus, ExportJobSummarySchema, FieldMappingEntrySchema, GetExportJobDownloadRequestSchema, GetExportJobDownloadResponseSchema, ImportJobProgressSchema, ImportJobResultsSchema, ImportJobStatus, ImportJobSummarySchema, ImportMappingSchema, ImportRequestSchema, ImportResponseSchema, ImportRowResultSchema, ImportValidationConfigSchema, ImportValidationMode, ImportValidationResultSchema, ImportWriteMode, ListExportJobsRequestSchema, ListExportJobsResponseSchema, ListImportJobsRequestSchema, ListImportJobsResponseSchema, ScheduleExportRequestSchema, ScheduleExportResponseSchema, ScheduledExportSchema, UndoImportJobResponseSchema } from '@objectstack/spec/api';
import type { CreateExportJobRequest, CreateExportJobResponse, CreateImportJobRequest, CreateImportJobResponse, DeduplicationStrategy, ExportFormat, ExportImportTemplate, ExportJobProgress, ExportJobStatus, ExportJobSummary, FieldMappingEntry, GetExportJobDownloadRequest, GetExportJobDownloadResponse, ImportJobProgress, ImportJobResults, ImportJobStatus, ImportJobSummary, ImportMapping, ImportRequest, ImportResponse, ImportRowResult, ImportValidationConfig, ImportValidationMode, ImportValidationResult, ImportWriteMode, ListExportJobsRequest, ListExportJobsResponse, ListImportJobsRequest, ListImportJobsResponse, ScheduleExportRequest, ScheduleExportResponse, ScheduledExport, UndoImportJobResponse } from '@objectstack/spec/api';
// Validate data
const result = CreateExportJobRequestSchema.parse(data);CreateExportJobRequest
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| object | string | ✅ | Object name to export |
| format | Enum<'csv' | 'json' | 'jsonl' | 'xlsx' | 'parquet'> | optional (default: "csv") | Export file format |
| fields | string[] | optional | Specific fields to include (omit for all fields) |
| filter | Record<string, any> | optional | Filter criteria for records to export |
| sort | { field: string; direction: Enum<'asc' | 'desc'> }[] | optional | Sort order for exported records |
| limit | integer | optional | Maximum number of records to export |
| includeHeaders | boolean | optional (default: true) | Include header row (CSV/XLSX) |
| encoding | string | optional (default: "utf-8") | Character encoding for the export file |
| templateId | string | optional | Export template ID for predefined field mappings |
CreateExportJobResponse
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| success | boolean | ✅ | Operation success status |
| error | { code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | …>; declaredCode?: string; message: string; userMessage?: string; … } | optional | Error details if success is false |
| meta | { timestamp: string; duration?: number; requestId?: string; traceId?: string } | optional | Response metadata |
| data | { jobId: string; status: Enum<'pending' | 'processing' | 'completed' | 'failed' | 'cancelled' | 'expired'>; estimatedRecords?: integer; createdAt: string } | ✅ |
CreateImportJobRequest
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| format | Enum<'csv' | 'json' | 'xlsx'> | optional | Payload shape: csv text, a rows[] array, or a base64 xlsx (inferred when omitted) |
| csv | string | optional | CSV text (when format = csv) |
| rows | Record<string, any>[] | optional | Row objects (when format = json) |
| xlsxBase64 | string | optional | Base64-encoded .xlsx workbook bytes (when format = xlsx); parsed server-side |
| sheet | string | integer | optional | Worksheet name or 1-based index to read (xlsx; defaults to the first sheet) |
| mapping | Record<string, string> | { sourceField: string; targetField: string; targetLabel?: string; transform: Enum<'none' | 'uppercase' | 'lowercase' | 'trim' | 'date_format' | 'lookup'>; … }[] | optional | Source column → target field mapping |
| mappingName | string | optional | Name of a registered mapping metadata artifact to apply; the server resolves it (org-scoped rows first, then env-wide) and projects columns through it. Mutually exclusive with an inline mapping — supplying both is refused (400 CONFLICTING_MAPPING). |
| dryRun | boolean | optional (default: false) | Validate + coerce every row without persisting. The verdict is the engine's own write-path validation, with one boundary an author should know: a preview runs NO automations. Hooks never fire in a dry run (#6037) — a preview that executed user-authored side effects (mail, outbound calls, writes to other objects) would be the retired validateOnly defect in a new spelling. So a dry run with runAutomations: true can report required for a field a beforeInsert hook would populate during the real import; for hook-derived fields the real write is authoritative. |
| writeMode | Enum<'insert' | 'update' | 'upsert'> | optional (default: "insert") | insert / update / upsert semantics |
| matchFields | string[] | optional | Fields that identify an existing record (required for update/upsert) |
| runAutomations | boolean | optional (default: true) | Fire triggers/hooks for each imported row. ON by default, and opting out must be explicit: automations always ran on import historically (the engine ignored this flag until #2922), so a caller that wants a silent bulk load sends runAutomations: false — omitting the key runs them. This matches platform convention (Salesforce fires triggers on import by default). One boundary: a dryRun preview runs NO automations whatever this flag says (#6037). |
| treatAsHistorical | boolean | optional (default: false) | Import as established historical facts. Two effects, both off by default so a normal import is unchanged: (1) skip the state_machine rule so mid-lifecycle rows (e.g. already-closed tickets, closed_won deals) are not rejected by initialStates (#3479); and (2) preserve the original audit timeline — keep the supplied created_at / updated_at / updated_by and author-declared business readonly fields (e.g. closed_at, resolved_by) instead of stamping-now / stripping them (#3493). Undoing a historical import mirrors (2): the captured pre-import values are restored verbatim rather than re-stamped (#3556). |
| trimWhitespace | boolean | optional (default: true) | Trim leading/trailing whitespace from string cells |
| nullValues | string[] | optional | Strings treated as null/blank (besides empty string) |
| createMissingOptions | boolean | optional (default: false) | Keep unmatched select values instead of failing the row |
| skipBlankMatchKey | boolean | optional (default: false) | Skip rows whose matchFields are blank (default: upsert creates them, update skips them) |
CreateImportJobResponse
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| jobId | string | ✅ | Import job id — poll progress/results with this |
| object | string | ✅ | Target object name |
| status | Enum<'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled'> | ✅ | Initial job status (usually "pending") |
| total | integer | ✅ | Rows accepted for processing |
| createdAt | string | ✅ | Job creation timestamp (ISO 8601) |
DeduplicationStrategy
Allowed Values
skipupdatecreate_newfail
ExportFormat
Allowed Values
csvjsonjsonlxlsxparquet
ExportImportTemplate
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| id | string | optional | Template ID (generated on save) |
| name | string | ✅ | Template machine name (snake_case) |
| label | string | ✅ | Human-readable template label |
| description | string | optional | Template description |
| object | string | ✅ | Target object name |
| direction | Enum<'import' | 'export' | 'bidirectional'> | ✅ | Template direction |
| format | Enum<'csv' | 'json' | 'jsonl' | 'xlsx' | 'parquet'> | optional | Default file format for this template |
| mappings | { sourceField: string; targetField: string; targetLabel?: string; transform: Enum<'none' | 'uppercase' | 'lowercase' | 'trim' | 'date_format' | 'lookup'>; … }[] | ✅ | Field mapping entries |
| createdAt | string | optional | Template creation timestamp |
| updatedAt | string | optional | Last update timestamp |
| createdBy | string | optional | User who created the template |
ExportJobProgress
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| success | boolean | ✅ | Operation success status |
| error | { code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | …>; declaredCode?: string; message: string; userMessage?: string; … } | optional | Error details if success is false |
| meta | { timestamp: string; duration?: number; requestId?: string; traceId?: string } | optional | Response metadata |
| data | { jobId: string; status: Enum<'pending' | 'processing' | 'completed' | 'failed' | 'cancelled' | 'expired'>; format: Enum<'csv' | 'json' | 'jsonl' | 'xlsx' | 'parquet'>; totalRecords?: integer; … } | ✅ |
ExportJobStatus
Allowed Values
pendingprocessingcompletedfailedcancelledexpired
ExportJobSummary
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| jobId | string | ✅ | Export job ID |
| object | string | ✅ | Object name that was exported |
| status | Enum<'pending' | 'processing' | 'completed' | 'failed' | 'cancelled' | 'expired'> | ✅ | Current job status |
| format | Enum<'csv' | 'json' | 'jsonl' | 'xlsx' | 'parquet'> | ✅ | Export file format |
| totalRecords | integer | optional | Total records exported |
| fileSize | integer | optional | File size in bytes |
| createdAt | string | ✅ | Job creation timestamp |
| completedAt | string | optional | Completion timestamp |
| createdBy | string | optional | User who initiated the export |
FieldMappingEntry
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| sourceField | string | ✅ | Field name in the source data (import) or object (export) |
| targetField | string | ✅ | Field name in the target object (import) or file column (export) |
| targetLabel | string | optional | Display label for the target column (export) |
| transform | Enum<'none' | 'uppercase' | 'lowercase' | 'trim' | 'date_format' | 'lookup'> | optional (default: "none") | Transformation to apply during mapping |
| defaultValue | any | optional | Default value if source field is null/empty |
| required | boolean | optional (default: false) | Whether this field is required (import validation) |
GetExportJobDownloadRequest
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| jobId | string | ✅ | Export job ID |
GetExportJobDownloadResponse
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| success | boolean | ✅ | Operation success status |
| error | { code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | …>; declaredCode?: string; message: string; userMessage?: string; … } | optional | Error details if success is false |
| meta | { timestamp: string; duration?: number; requestId?: string; traceId?: string } | optional | Response metadata |
| data | { jobId: string; downloadUrl: string; fileName: string; fileSize: integer; … } | ✅ |
ImportJobProgress
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| jobId | string | ✅ | Import job id |
| object | string | ✅ | Target object name |
| status | Enum<'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled'> | ✅ | Current job status |
| dryRun | boolean | ✅ | Whether this is a validate-only pass |
| writeMode | Enum<'insert' | 'update' | 'upsert'> | ✅ | Write mode used |
| total | integer | ✅ | Total rows to process |
| processed | integer | ✅ | Rows processed so far |
| created | integer | ✅ | Rows that created a new record |
| updated | integer | ✅ | Rows that updated an existing record |
| skipped | integer | ✅ | Rows skipped |
| errors | integer | ✅ | Rows that failed |
| percentComplete | number | ✅ | processed / total as a percentage |
| undoable | boolean | ✅ | Whether this job can still be logically rolled back (undo log captured, terminal state, not yet reverted) |
| revertedAt | string | optional | When the job was undone / rolled back (ISO 8601) |
| error | string | optional | Fatal error message (when status = failed) |
| startedAt | string | optional | Processing start timestamp (ISO 8601) |
| completedAt | string | optional | Completion timestamp (ISO 8601) |
| createdAt | string | ✅ | Job creation timestamp (ISO 8601) |
ImportJobResults
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| jobId | string | ✅ | Import job id |
| object | string | ✅ | Target object name |
| status | Enum<'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled'> | ✅ | Current job status |
| dryRun | boolean | ✅ | Whether this is a validate-only pass |
| writeMode | Enum<'insert' | 'update' | 'upsert'> | ✅ | Write mode used |
| total | integer | ✅ | Total rows to process |
| processed | integer | ✅ | Rows processed so far |
| created | integer | ✅ | Rows that created a new record |
| updated | integer | ✅ | Rows that updated an existing record |
| skipped | integer | ✅ | Rows skipped |
| errors | integer | ✅ | Rows that failed |
| percentComplete | number | ✅ | processed / total as a percentage |
| undoable | boolean | ✅ | Whether this job can still be logically rolled back (undo log captured, terminal state, not yet reverted) |
| revertedAt | string | optional | When the job was undone / rolled back (ISO 8601) |
| error | string | optional | Fatal error message (when status = failed) |
| startedAt | string | optional | Processing start timestamp (ISO 8601) |
| completedAt | string | optional | Completion timestamp (ISO 8601) |
| createdAt | string | ✅ | Job creation timestamp (ISO 8601) |
| results | { row: integer; ok: boolean; action: Enum<'created' | 'updated' | 'skipped' | 'failed'>; id?: string; … }[] | ✅ | Capped sample of per-row outcomes (failures first) |
| resultsTruncated | boolean | ✅ | Whether results is a capped sample of a larger set |
ImportJobStatus
Allowed Values
pendingrunningsucceededfailedcancelled
ImportJobSummary
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| jobId | string | ✅ | Import job id |
| object | string | ✅ | Target object name |
| status | Enum<'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled'> | ✅ | Job status |
| total | integer | ✅ | Total rows |
| processed | integer | ✅ | Rows processed |
| created | integer | ✅ | Rows created |
| updated | integer | ✅ | Rows updated |
| skipped | integer | ✅ | Rows skipped |
| errors | integer | ✅ | Rows failed |
| createdAt | string | ✅ | Job creation timestamp (ISO 8601) |
| completedAt | string | optional | Completion timestamp (ISO 8601) |
| undoable | boolean | ✅ | Whether this job can still be logically rolled back |
| revertedAt | string | optional | When the job was undone / rolled back (ISO 8601) |
ImportMapping
Union Options
This schema accepts one of the following structures:
Option 1
Type: Record<string, string>
Option 2
Type: { sourceField: string; targetField: string; targetLabel?: string; transform: Enum<'none' | 'uppercase' | 'lowercase' | 'trim' | 'date_format' | 'lookup'>; … }[]
ImportRequest
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| format | Enum<'csv' | 'json' | 'xlsx'> | optional | Payload shape: csv text, a rows[] array, or a base64 xlsx (inferred when omitted) |
| csv | string | optional | CSV text (when format = csv) |
| rows | Record<string, any>[] | optional | Row objects (when format = json) |
| xlsxBase64 | string | optional | Base64-encoded .xlsx workbook bytes (when format = xlsx); parsed server-side |
| sheet | string | integer | optional | Worksheet name or 1-based index to read (xlsx; defaults to the first sheet) |
| mapping | Record<string, string> | { sourceField: string; targetField: string; targetLabel?: string; transform: Enum<'none' | 'uppercase' | 'lowercase' | 'trim' | 'date_format' | 'lookup'>; … }[] | optional | Source column → target field mapping |
| mappingName | string | optional | Name of a registered mapping metadata artifact to apply; the server resolves it (org-scoped rows first, then env-wide) and projects columns through it. Mutually exclusive with an inline mapping — supplying both is refused (400 CONFLICTING_MAPPING). |
| dryRun | boolean | optional (default: false) | Validate + coerce every row without persisting. The verdict is the engine's own write-path validation, with one boundary an author should know: a preview runs NO automations. Hooks never fire in a dry run (#6037) — a preview that executed user-authored side effects (mail, outbound calls, writes to other objects) would be the retired validateOnly defect in a new spelling. So a dry run with runAutomations: true can report required for a field a beforeInsert hook would populate during the real import; for hook-derived fields the real write is authoritative. |
| writeMode | Enum<'insert' | 'update' | 'upsert'> | optional (default: "insert") | insert / update / upsert semantics |
| matchFields | string[] | optional | Fields that identify an existing record (required for update/upsert) |
| runAutomations | boolean | optional (default: true) | Fire triggers/hooks for each imported row. ON by default, and opting out must be explicit: automations always ran on import historically (the engine ignored this flag until #2922), so a caller that wants a silent bulk load sends runAutomations: false — omitting the key runs them. This matches platform convention (Salesforce fires triggers on import by default). One boundary: a dryRun preview runs NO automations whatever this flag says (#6037). |
| treatAsHistorical | boolean | optional (default: false) | Import as established historical facts. Two effects, both off by default so a normal import is unchanged: (1) skip the state_machine rule so mid-lifecycle rows (e.g. already-closed tickets, closed_won deals) are not rejected by initialStates (#3479); and (2) preserve the original audit timeline — keep the supplied created_at / updated_at / updated_by and author-declared business readonly fields (e.g. closed_at, resolved_by) instead of stamping-now / stripping them (#3493). Undoing a historical import mirrors (2): the captured pre-import values are restored verbatim rather than re-stamped (#3556). |
| trimWhitespace | boolean | optional (default: true) | Trim leading/trailing whitespace from string cells |
| nullValues | string[] | optional | Strings treated as null/blank (besides empty string) |
| createMissingOptions | boolean | optional (default: false) | Keep unmatched select values instead of failing the row |
| skipBlankMatchKey | boolean | optional (default: false) | Skip rows whose matchFields are blank (default: upsert creates them, update skips them) |
ImportResponse
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| object | string | ✅ | Target object name |
| dryRun | boolean | ✅ | Whether this was a validate-only pass |
| writeMode | Enum<'insert' | 'update' | 'upsert'> | ✅ | Write mode used |
| total | integer | ✅ | Rows processed |
| ok | integer | ✅ | Rows that succeeded |
| errors | integer | ✅ | Rows that failed |
| created | integer | ✅ | Rows that created a new record |
| updated | integer | ✅ | Rows that updated an existing record |
| skipped | integer | ✅ | Rows skipped (no match in update mode, etc.) |
| results | { row: integer; ok: boolean; action: Enum<'created' | 'updated' | 'skipped' | 'failed'>; id?: string; … }[] | ✅ | Per-row outcomes |
ImportRowResult
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| row | integer | ✅ | 1-based row number in the source data |
| ok | boolean | ✅ | Whether the row succeeded |
| action | Enum<'created' | 'updated' | 'skipped' | 'failed'> | ✅ | What happened to the row |
| id | string | optional | Record id (created/updated rows) |
| field | string | optional | Field that caused a coercion/validation error |
| code | string | optional | Error code (failed rows) |
| error | string | optional | Human-readable error message (failed rows) |
ImportValidationConfig
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| mode | Enum<'strict' | 'lenient' | 'dry_run'> | optional (default: "strict") | Validation mode for the import |
| deduplication | { strategy: Enum<'skip' | 'update' | 'create_new' | 'fail'>; matchFields: string[] } | optional | Deduplication configuration |
| maxErrors | integer | optional (default: 100) | Maximum validation errors before aborting |
| trimWhitespace | boolean | optional (default: true) | Trim leading/trailing whitespace from string fields |
| dateFormat | string | optional | Expected date format in import data (e.g., "YYYY-MM-DD") |
| nullValues | string[] | optional | Strings to treat as null (e.g., ["", "N/A", "null"]) |
ImportValidationMode
Allowed Values
strictlenientdry_run
ImportValidationResult
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| success | boolean | ✅ | Operation success status |
| error | { code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | …>; declaredCode?: string; message: string; userMessage?: string; … } | optional | Error details if success is false |
| meta | { timestamp: string; duration?: number; requestId?: string; traceId?: string } | optional | Response metadata |
| data | { totalRecords: integer; validRecords: integer; invalidRecords: integer; duplicateRecords: integer; … } | ✅ |
ImportWriteMode
Allowed Values
insertupdateupsert
ListExportJobsRequest
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| object | string | optional | Filter by object name |
| status | Enum<'pending' | 'processing' | 'completed' | 'failed' | 'cancelled' | 'expired'> | optional | Filter by job status |
| limit | integer | optional (default: 20) | Maximum number of jobs to return |
| cursor | string | optional | Pagination cursor from a previous response |
ListExportJobsResponse
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| success | boolean | ✅ | Operation success status |
| error | { code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | …>; declaredCode?: string; message: string; userMessage?: string; … } | optional | Error details if success is false |
| meta | { timestamp: string; duration?: number; requestId?: string; traceId?: string } | optional | Response metadata |
| data | { jobs: object[]; nextCursor?: string; hasMore: boolean } | ✅ |
ListImportJobsRequest
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| object | string | optional | Filter to one target object |
| status | Enum<'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled'> | optional | Filter by job status |
| limit | integer | optional (default: 50) | Max rows to return |
| offset | integer | optional (default: 0) | Pagination offset |
ListImportJobsResponse
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| jobs | { jobId: string; object: string; status: Enum<'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled'>; total: integer; … }[] | ✅ | Import jobs, newest first |
ScheduleExportRequest
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| name | string | ✅ | Schedule name (snake_case) |
| label | string | optional | Human-readable label |
| object | string | ✅ | Object name to export |
| format | Enum<'csv' | 'json' | 'jsonl' | 'xlsx' | 'parquet'> | optional (default: "csv") | Export file format |
| fields | string[] | optional | Fields to include |
| filter | Record<string, any> | optional | Record filter criteria |
| templateId | string | optional | Export template ID for field mappings |
| schedule | { cronExpression: string | object; timezone?: string } | ✅ | Schedule timing configuration |
| delivery | { method: Enum<'email' | 'storage' | 'webhook'>; recipients?: string[]; storagePath?: string; webhookUrl?: string } | ✅ | Export delivery configuration |
ScheduleExportResponse
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| success | boolean | ✅ | Operation success status |
| error | { code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | …>; declaredCode?: string; message: string; userMessage?: string; … } | optional | Error details if success is false |
| meta | { timestamp: string; duration?: number; requestId?: string; traceId?: string } | optional | Response metadata |
| data | { id: string; name: string; enabled: boolean; nextRunAt?: string; … } | ✅ |
ScheduledExport
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| id | string | optional | Scheduled export ID |
| name | string | ✅ | Schedule name (snake_case) |
| label | string | optional | Human-readable label |
| object | string | ✅ | Object name to export |
| format | Enum<'csv' | 'json' | 'jsonl' | 'xlsx' | 'parquet'> | optional (default: "csv") | Export file format |
| fields | string[] | optional | Fields to include |
| filter | Record<string, any> | optional | Record filter criteria |
| templateId | string | optional | Export template ID for field mappings |
| schedule | { cronExpression: string | object; timezone?: string } | ✅ | Schedule timing configuration |
| delivery | { method: Enum<'email' | 'storage' | 'webhook'>; recipients?: string[]; storagePath?: string; webhookUrl?: string } | ✅ | Export delivery configuration |
| enabled | boolean | optional (default: true) | Whether the scheduled export is active |
| lastRunAt | string | optional | Last execution timestamp |
| nextRunAt | string | optional | Next scheduled execution |
| createdAt | string | optional | Creation timestamp |
| createdBy | string | optional | User who created the schedule |
UndoImportJobResponse
Properties
| Property | Type | Required | Description |
|---|---|---|---|
| success | boolean | ✅ | Whether the undo completed |
| jobId | string | ✅ | Import job id |
| object | string | ✅ | Target object name |
| deleted | integer | ✅ | Created records deleted |
| restored | integer | ✅ | Updated records restored to pre-import values |
| failed | integer | ✅ | Reversal operations that failed |