Eshway Migration API
The Migration API from Eshway — 9 operation(s) for migration.
The Migration API from Eshway — 9 operation(s) for migration.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/eshway-com:eshway-com-migration-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Fast Migration API
version: 0.1.0
tags:
- name: Migration
paths:
/v1/migration/providers:
get:
tags:
- Migration
summary: List Providers
description: List all available migration providers.
operationId: list_providers_v1_migration_providers_get
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ProvidersResponse'
/v1/migration/validate:
post:
tags:
- Migration
summary: Validate Credentials
description: 'Validate provider credentials without starting a migration.
Authenticated callers only — without auth, anyone could use the LTD backend
as a free outbound proxy to hammer Asana/Trello/etc. APIs (denial-of-wallet
+ credential-harvesting honeypot from competitors).
H7: rate-limited at 10 req/min per IP. Validating credentials is the
most cost-amplifying operation here (each call hits the upstream
provider API), so the cap is the strictest of the three probes.'
operationId: validate_credentials_v1_migration_validate_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ValidateCredentialsRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ValidateCredentialsResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- OAuth2PasswordBearer: []
/v1/migration/fetch-structure:
post:
tags:
- Migration
summary: Fetch Structure
description: 'Fetch the workspace/project hierarchy from the source tool.
Authenticated only — same reasoning as /validate above.
H7: rate-limited at 20 req/min — slightly more permissive than
/validate because legitimate UI flows refresh structure on retry.'
operationId: fetch_structure_v1_migration_fetch_structure_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/FetchStructureRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/FetchStructureResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- OAuth2PasswordBearer: []
/v1/migration/preview:
post:
tags:
- Migration
summary: Preview Migration
description: 'Dry-run: show counts of what will be imported.
Authenticated only — same reasoning as /validate above.
H7: rate-limited at 5 req/min — preview iterates the entire workspace
upstream-side, so it''s the most expensive of the three probes per
call. Cap is conservative.'
operationId: preview_migration_v1_migration_preview_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PreviewRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/PreviewResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- OAuth2PasswordBearer: []
/v1/migration/start:
post:
tags:
- Migration
summary: Start Migration
description: Start a migration job in the background.
operationId: start_migration_v1_migration_start_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StartMigrationRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/StartMigrationResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- OAuth2PasswordBearer: []
/v1/migration/jobs:
get:
tags:
- Migration
summary: List Jobs
description: List migration jobs for the current organization.
operationId: list_jobs_v1_migration_jobs_get
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/MigrationJobListResponse'
security:
- OAuth2PasswordBearer: []
/v1/migration/jobs/{job_id}:
get:
tags:
- Migration
summary: Get Job Status
description: Get status/progress of a specific migration job.
operationId: get_job_status_v1_migration_jobs__job_id__get
security:
- OAuth2PasswordBearer: []
parameters:
- name: job_id
in: path
required: true
schema:
type: integer
title: Job Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/MigrationJobResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/v1/migration/jobs/{job_id}/cancel:
post:
tags:
- Migration
summary: Cancel Job
description: Cancel a running migration job.
operationId: cancel_job_v1_migration_jobs__job_id__cancel_post
security:
- OAuth2PasswordBearer: []
parameters:
- name: job_id
in: path
required: true
schema:
type: integer
title: Job Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/MigrationJobResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/v1/migration/jobs/{job_id}/report:
get:
tags:
- Migration
summary: Get Job Report
description: Get the final report of a completed migration job.
operationId: get_job_report_v1_migration_jobs__job_id__report_get
security:
- OAuth2PasswordBearer: []
parameters:
- name: job_id
in: path
required: true
schema:
type: integer
title: Job Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/MigrationReportResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
components:
schemas:
FetchStructureResponse:
properties:
workspaces:
items:
$ref: '#/components/schemas/SourceWorkspace'
type: array
title: Workspaces
default: []
projects:
items:
$ref: '#/components/schemas/SourceProject'
type: array
title: Projects
default: []
members:
items:
$ref: '#/components/schemas/SourceMember'
type: array
title: Members
default: []
type: object
title: FetchStructureResponse
StartMigrationResponse:
properties:
job_id:
type: integer
title: Job Id
status:
type: string
title: Status
organization_id:
anyOf:
- type: integer
- type: 'null'
title: Organization Id
type: object
required:
- job_id
- status
title: StartMigrationResponse
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
type: object
required:
- loc
- msg
- type
title: ValidationError
MigrationJobListResponse:
properties:
jobs:
items:
$ref: '#/components/schemas/MigrationJobResponse'
type: array
title: Jobs
type: object
required:
- jobs
title: MigrationJobListResponse
PreviewRequest:
properties:
provider:
$ref: '#/components/schemas/MigrationProviderSlug'
credentials:
additionalProperties:
type: string
type: object
title: Credentials
workspace_id:
anyOf:
- type: string
- type: 'null'
title: Workspace Id
selected_project_ids:
items:
type: string
type: array
title: Selected Project Ids
type: object
required:
- provider
- credentials
- selected_project_ids
title: PreviewRequest
MigrationProviderSlug:
type: string
enum:
- clickup
- jira
- asana
- trello
- monday
- linear
title: MigrationProviderSlug
SourceProject:
properties:
id:
type: string
title: Id
name:
type: string
title: Name
task_count:
type: integer
title: Task Count
default: 0
status_count:
type: integer
title: Status Count
default: 0
member_count:
type: integer
title: Member Count
default: 0
statuses:
items:
$ref: '#/components/schemas/SourceStatus'
type: array
title: Statuses
default: []
parent_id:
anyOf:
- type: string
- type: 'null'
title: Parent Id
parent_name:
anyOf:
- type: string
- type: 'null'
title: Parent Name
type:
anyOf:
- type: string
- type: 'null'
title: Type
type: object
required:
- id
- name
title: SourceProject
SourceStatus:
properties:
id:
type: string
title: Id
name:
type: string
title: Name
color:
anyOf:
- type: string
- type: 'null'
title: Color
type:
anyOf:
- type: string
- type: 'null'
title: Type
type: object
required:
- id
- name
title: SourceStatus
FieldMappingConfig:
properties:
statuses:
additionalProperties:
$ref: '#/components/schemas/StatusMappingEntry'
type: object
title: Statuses
default: {}
priorities:
additionalProperties:
type: string
type: object
title: Priorities
default: {}
members:
additionalProperties:
anyOf:
- type: integer
- type: 'null'
type: object
title: Members
default: {}
type: object
title: FieldMappingConfig
SourceWorkspace:
properties:
id:
type: string
title: Id
name:
type: string
title: Name
type: object
required:
- id
- name
title: SourceWorkspace
MigrationProgress:
properties:
total:
type: integer
title: Total
default: 0
completed:
type: integer
title: Completed
default: 0
failed:
type: integer
title: Failed
default: 0
current_step:
type: string
title: Current Step
default: ''
type: object
title: MigrationProgress
MigrationReportResponse:
properties:
id:
type: integer
title: Id
provider:
type: string
title: Provider
status:
type: string
title: Status
progress:
$ref: '#/components/schemas/MigrationProgress'
summary:
type: object
title: Summary
error_log:
items:
type: object
type: array
title: Error Log
created_at:
type: string
format: date-time
title: Created At
completed_at:
anyOf:
- type: string
format: date-time
- type: 'null'
title: Completed At
type: object
required:
- id
- provider
- status
- progress
- summary
- error_log
- created_at
title: MigrationReportResponse
PreviewResponse:
properties:
total_projects:
type: integer
title: Total Projects
total_tasks:
type: integer
title: Total Tasks
total_statuses:
type: integer
title: Total Statuses
total_members:
type: integer
title: Total Members
default_field_mapping:
type: object
title: Default Field Mapping
type: object
required:
- total_projects
- total_tasks
- total_statuses
- total_members
- default_field_mapping
title: PreviewResponse
ProviderInfo:
properties:
id:
type: string
title: Id
name:
type: string
title: Name
icon:
type: string
title: Icon
description:
type: string
title: Description
auth_type:
$ref: '#/components/schemas/AuthType'
available:
type: boolean
title: Available
type: object
required:
- id
- name
- icon
- description
- auth_type
- available
title: ProviderInfo
StatusMappingEntry:
properties:
target_name:
type: string
title: Target Name
target_type:
type: string
title: Target Type
default: intermediate
color:
anyOf:
- type: string
- type: 'null'
title: Color
type: object
required:
- target_name
title: StatusMappingEntry
FetchStructureRequest:
properties:
provider:
$ref: '#/components/schemas/MigrationProviderSlug'
credentials:
additionalProperties:
type: string
type: object
title: Credentials
workspace_id:
anyOf:
- type: string
- type: 'null'
title: Workspace Id
type: object
required:
- provider
- credentials
title: FetchStructureRequest
ValidateCredentialsResponse:
properties:
valid:
type: boolean
title: Valid
workspace_name:
anyOf:
- type: string
- type: 'null'
title: Workspace Name
workspace_id:
anyOf:
- type: string
- type: 'null'
title: Workspace Id
error:
anyOf:
- type: string
- type: 'null'
title: Error
type: object
required:
- valid
title: ValidateCredentialsResponse
SourceMember:
properties:
id:
type: string
title: Id
name:
type: string
title: Name
email:
anyOf:
- type: string
- type: 'null'
title: Email
avatar:
anyOf:
- type: string
- type: 'null'
title: Avatar
type: object
required:
- id
- name
title: SourceMember
AuthType:
type: string
enum:
- api_token
- oauth
- api_key_secret
title: AuthType
ProvidersResponse:
properties:
providers:
items:
$ref: '#/components/schemas/ProviderInfo'
type: array
title: Providers
type: object
required:
- providers
title: ProvidersResponse
StartMigrationRequest:
properties:
provider:
$ref: '#/components/schemas/MigrationProviderSlug'
credentials:
additionalProperties:
type: string
type: object
title: Credentials
workspace_id:
anyOf:
- type: string
- type: 'null'
title: Workspace Id
selected_project_ids:
items:
type: string
type: array
title: Selected Project Ids
field_mapping:
$ref: '#/components/schemas/FieldMappingConfig'
options:
type: object
title: Options
organization_id:
anyOf:
- type: integer
- type: 'null'
title: Organization Id
create_new_organization:
type: boolean
title: Create New Organization
default: false
new_organization_name:
anyOf:
- type: string
- type: 'null'
title: New Organization Name
type: object
required:
- provider
- credentials
- selected_project_ids
- field_mapping
title: StartMigrationRequest
ValidateCredentialsRequest:
properties:
provider:
$ref: '#/components/schemas/MigrationProviderSlug'
credentials:
additionalProperties:
type: string
type: object
title: Credentials
type: object
required:
- provider
- credentials
title: ValidateCredentialsRequest
MigrationJobResponse:
properties:
id:
type: integer
title: Id
provider:
type: string
title: Provider
status:
type: string
title: Status
progress:
$ref: '#/components/schemas/MigrationProgress'
summary:
anyOf:
- type: object
- type: 'null'
title: Summary
created_at:
type: string
format: date-time
title: Created At
completed_at:
anyOf:
- type: string
format: date-time
- type: 'null'
title: Completed At
type: object
required:
- id
- provider
- status
- progress
- created_at
title: MigrationJobResponse
securitySchemes:
OAuth2PasswordBearer:
type: oauth2
flows:
password:
scopes: {}
tokenUrl: token