Click to play · 42 seconds

Your data is trapped.
Source A
🔒
Source B
🔒
Internal v1
🔒
Platform X
🔒
📄 api-docs.swagger.json
GET/entities/{id}
POST/records/batch
PUT/users/{id}/fields
GET/attachments
DELETE/containers/{id}
... +318 more endpoints
Month 3 of 5...
⌨ migrate.py
def map_fields(src, dst):
  # TODO: handle nulls
  for field in src.fields:
    # edge case: custom fields
  ⚠ attachment ref broken
  ✕ user lookup failed
🗑 Scripts thrown away. Start over.
Migratly — New Migration
Source API documentation
Destination API documentation
API credentials (stored encrypted)
→ Let's go
API docs + credentials. That's all it needs.
Migratly · Migration Plan Ready
Plan generated: 9 entity types · 47 fields · 4 type conversions · dependency order calculated automatically
Records → Pages · Users → Members · Attachments → Files · Relations → Links · Containers → Workspaces
How are custom fields handled?
Custom fields are mapped by type: text→rich_text, number→number, date→date. 2 fields have no direct match — flagged for your decision.
✓ Approve & Run Migration
Running migration
0 / 8,241 records
Audit Log
user:u_8821 → member:m_4401 14:02:01
container:CORE → workspace:CORE 14:02:02
record:BUG-441 → page:BUG-441 14:02:03
attachment:img.png → file:img.png 14:02:03
relation:LINK-209 → link resolved 14:02:04
Any system. Any data. Migratly.
Data belongs to you.
Take it wherever you go.
Come to us when you need to move your data.
We'll take care of the rest.
migratly.com  →