What is Feed API?
When synchronizing two systems, you have two primary approaches:
card: Classical API
icon: refresh-cw
Read data via API, detect changes locally, and push only modifications. Requires change tracking and state management on the client side.
**Best for:**
- Real-time synchronization
- Frequent small updates
- Fine-grained control over changes
card: Feed API
icon: zap
Send one large JSON (even gigabytes) with all values. The system efficiently compares and updates only real changes.
**Best for:**
- Bulk data synchronization
- Periodic full syncs
- Simpler integration logic
How Feed API Works
1. Efficient Preload
The system efficiently preloads existing data for comparison using optimized database queries.
2. Intelligent Matching
Records are matched using lookups (code:, id:) or unique identifiers. Even items without unique IDs (like line items) are matched using a probability mechanism.
3. Change Detection
The system compares all data and identifies actual changes, eliminating false differences.
4. Selective Updates
Only real changes are written to the database, minimizing overhead and maintaining audit trails.
Core Components
Feed API leverages two powerful tools: Mapper and Importer
card: Mapper
icon: settings
Transforms external data formats (XML, JSON, CSV) into the internal format. Handles field mapping, data transformations, and type conversions.
**Key Features:**
- JSONPath and XPath support
- Expression evaluation
- Lookup resolution
- Nested entity mapping
[navigate:/devdoc/mapper|View Docs|book-open]
card: Importer
icon: upload
Processes mapped data and intelligently updates the database. Handles upserts, deletions, and relationship management.
**Key Features:**
- Upsert operations
- Lookup-based matching
- Probabilistic matching
- Batch processing
[navigate:/devdoc/imports|View Docs|book-open]
Key Directives
Essential directives for Feed API operations
Lookups (code:, id:, etc.)
Identify records using various lookup types instead of database IDs.
"category": "code:ELECTRONICS"
"manufacturer": "id:12345"
"customer": "email:john@example.com"
@removeAll
Controls whether existing items not in the feed should be removed.
"items": [
{ "code": "ITEM-1", "quantity": 10 }
],
"items@removeAll": true // Remove items not in feed
Default: true for array/object mode, false for merge mode
@operation
Explicitly control the operation type for each record.
{ "@operation": "upsert", "code": "PROD-1", "name": "Product 1" }
{ "@operation": "delete", "code": "PROD-OLD" }
{ "@operation": "create", "name": "New Product" }
Values: create, update, upsert, delete
@where
Mass operations using where clauses for bulk updates or deletions.
{
"@operation": "update",
"@where": "category = 'code:OLD_CAT'",
"category": "code:NEW_CAT"
}
@atomic
Controls transaction behavior and error handling.
"@atomic": "batch" // Recommended for large feeds
"@atomic": true // All-or-nothing
"@atomic": false // Independent records
Example: Products Feed
Complete example of synchronizing products via Feed API
1. Source Data (External System)
{
"products": [
{
"productCode": "WIDGET-001",
"productName": "Super Widget",
"price": 99.99,
"categoryCode": "ELECTRONICS",
"variants": [
{
"sku": "WIDGET-001-RED",
"color": "Red",
"stock": 50
},
{
"sku": "WIDGET-001-BLUE",
"color": "Blue",
"stock": 30
}
]
},
{
"productCode": "GADGET-002",
"productName": "Mega Gadget",
"price": 149.99,
"categoryCode": "ELECTRONICS"
}
]
}
2. Mapper Configuration
type JSON
@atomic = "batch"
@language = "en"
products = '$.products[*]' {
id[code] = 'productCode'
name = 'productName'
price = 'price'
category[code] = 'categoryCode'
variants = 'variants[*]' {
code = 'sku'
color = 'color'
stockQuantity = 'stock'
@removeAll = "true"
}
}
3. Resulting Import JSON
{
"@atomic": "batch",
"products": [
{
"id": "code:WIDGET-001",
"name": "Super Widget",
"price": 99.99,
"category": "code:ELECTRONICS",
"variants": [
{
"code": "WIDGET-001-RED",
"color": "Red",
"stockQuantity": 50
},
{
"code": "WIDGET-001-BLUE",
"color": "Blue",
"stockQuantity": 30
}
],
"variants@removeAll": true
},
{
"id": "code:GADGET-002",
"name": "Mega Gadget",
"price": 149.99,
"category": "code:ELECTRONICS"
}
]
}
**What Happens:**
- Products are matched by code (`code:WIDGET-001`)
- Category is resolved via lookup (`code:ELECTRONICS`)
- Existing variants not in the feed are removed (`@removeAll: true`)
- New variants are created, existing ones are updated
- Only actual changes are written to database
- Processing is done in batches for optimal performance
Example: Invoices Feed
Synchronizing invoices with line items
{
"@atomic": "batch",
"invoices": [
{
"id": "code:INV-2024-001",
"customer": "code:CUSTOMER-123",
"issueDate": "2024-01-15",
"dueDate": "2024-02-15",
"items": [
{
"product": "code:WIDGET-001",
"quantity": 5,
"unitPrice": 99.99,
"description": "Super Widget - Red"
},
{
"product": "code:GADGET-002",
"quantity": 2,
"unitPrice": 149.99,
"description": "Mega Gadget"
}
],
"items@removeAll": true
}
]
}
**Probabilistic Matching:**
Even though invoice line items typically don't have unique identifiers, the system uses a probability mechanism to match them based on product, quantity, and other fields. This ensures accurate updates without duplicate line items.
Generating Feeds
Feed API can also generate data exports in various formats
You can use the Feed API not just for imports, but also to generate data exports:
Query-Based Export
Use the query language to extract data and export it in various formats.
GET /api/products?format=json&export=true
Reverse Mapper
Use mappers in reverse to transform internal data back to external formats.
Forward Mapper
Apply forward mappers to generate specialized export formats.
Supported Export Formats:
JSON, XML, CSV, Excel, PDF, HTML, Custom
[navigate:/devdoc/exports|View Export Documentation|file-text]
Best Practices
- Use batch mode for large feeds — Set
@atomic: "batch"for optimal performance with large datasets. - Use lookups instead of database IDs — Prefer
code:,email:, or other business keys for better portability. - Leverage @removeAll for complete synchronization — Use
@removeAll: trueto ensure deleted items are removed from the target system. - Test with small datasets first — Validate your mapper and import logic with a small subset before processing large feeds.
- Monitor import results — Check import logs and error reports to identify and fix data issues.
Testing Tools
Interactive tools to test and validate your Feed API setup
[navigate:/devdoc/test-mapper|Test Mapper|settings] [navigate:/devdoc/test-import|Test Import|upload]
Test your mapper configuration with sample data and test import operations
Related Documentation
[navigate:/devdoc/mapper|Mapper Documentation|settings] [navigate:/devdoc/imports|Import System|upload] [navigate:/devdoc/exports|Export System|file-text] [navigate:/devdoc/query|Query Language|database]