---
title: "Migrate a mandate to Pro Account"
method: POST
path: "/api/external/v2/pro_account/mandate_migrations"
tags: ["Mandates"]
---

# Migrate a mandate to Pro Account

`POST /api/external/v2/pro_account/mandate_migrations`

## Request

- Base URL: `https://app.pennylane.com`
- URL: `https://app.pennylane.com/api/external/v2/pro_account/mandate_migrations`
- Auth: OAuth 2
  - Authorization code: `https://app.pennylane.com/oauth/authorize`
  - Token URL: `https://app.pennylane.com/oauth/oauth/token` scopes: `customer_mandates:all`

This endpoint allows you to migrate a mandate to a Pro Account.
Only mandates with status 'available' are eligible for migration.

**Requirements:**
- Company must have a Pro Account (returns 404 if not)
- Company must have an enabled merchant profile (returns 403 if not)


> ℹ️
> This endpoint requires the following scope: `customer_mandates:all`

## Headers

- `X-Company-Id` string

## Request body

- object
  - `mandate_type` 'SepaMandate' | 'Mandate', required: The type of the mandate to migrate. Use "Mandate" for GoCardless mandates or "SepaMandate" for SEPA mandates.
  - `mandate_id` integer, required: The ID of the mandate to migrate.
  - `early_execution_date_permitted` boolean: Whether to permit early execution date for the migration. Defaults to false if not specified.

## Response `201`

Mandate migration initiated successfully

- object
  - `mandate_migration` object, required
    - `id` integer, required
    - `status` string, required
    - `direct_debit_method` 'GoCardless' | 'XML' | 'ProAccount', nullable, required: The direct debit method used by this mandate. - `GoCardless`: GoCardless mandate - `XML`: SEPA mandate - `ProAccount`: Pro Account mandate
    - `signed_at` string, date-time, nullable, required: Date when the mandate was signed
    - `error_message` string, nullable, required: Error message if the migration failed
    - `migrated_at` string, date-time, nullable, required: Date when the mandate was successfully migrated
    - `migration_started_at` string, date-time, nullable, required: Date when the migration was started
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `mandate` object, required: A polymorphic mandate object can either be a SepaMandate or a Gocardless mandate.
      - `id` integer, required
      - `type` string, required
    - `customer` object, required
      - `id` integer, required
      - `url` string, required: URL to get the customer.
      - `pro_account_mandate` object, required: Link to the pro account mandate for this customer.
        - `url` string, required: URL to list pro account mandates for this customer.

## Other responses

- `400`: Bad request
- `401`: Access token is missing or invalid
- `403`: Access to this resource forbidden
- `404`: The resource was not found
- `422`: Unprocessable content

## Changes

- **2026-11-03** `871f863307e5`: 1 info
  - added the new optional `header` request parameter `X-Company-Id`

[Operation history](https://skmtc.dev/pennylane/apis/company-v2/changes/api/external/v2/pro_account/mandate_migrations/post.md)

---

[API](https://skmtc.dev/pennylane/apis/company-v2.md) - [All operations](https://skmtc.dev/pennylane/apis/company-v2/llms.txt) - [OpenAPI document](https://skmtc.dev/pennylane/apis/company-v2/revisions/871f863307e5?raw)
