Eshway Migration API

The Migration API from Eshway — 9 operation(s) for migration.

GitHub OpenAPI

Operations 9

GET /v1/migration/providers List Providers #
POST /v1/migration/validate Validate Credentials #
POST /v1/migration/fetch-structure Fetch Structure #
POST /v1/migration/preview Preview Migration #
POST /v1/migration/start Start Migration #
GET /v1/migration/jobs List Jobs #
GET /v1/migration/jobs/{job_id} Get Job Status #
POST /v1/migration/jobs/{job_id}/cancel Cancel Job #
GET /v1/migration/jobs/{job_id}/report Get Job Report #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/eshway-com:eshway-com-migration-api"
All apis
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.

Get an API 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 Specification

eshway-com-migration-api-openapi.yml Raw ↑
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