Skip to content

Change billing currency via API

Updated: Jun 23, 2026

The Currency Migration API allows you to change the billing currency or payment method on a WhatsApp Business account (WABA) by creating a new WABA and automatically migrating your phone numbers, message templates, and Flows.

Use this API when you need to:

  • Change currency: Clone an existing WABA into a new WABA with a different currency while migrating assets (phone numbers, templates, Flows). This can make it easier for you to opt-in to be charged in a newly-available currency, like Mexican pesos (available as of January 1, 2026).
  • Change payment method: Move a WABA from one payment method to another while preserving assets.

Before you begin

  • The second call moves phone numbers and deprecates the old WABA. Plan for any operational timing requirements.
  • Coexistence and Authorized Agents WABAs are not eligible for migration via this API.
  • For payment method changes, only credit card to Line of Credit and Line of Credit to Line of Credit migrations are supported. Migrating from Line of Credit to credit card or credit card to credit card is not supported.
  • Lines of Credit are always denominated in USD, regardless of your WABA's billing currency. You do not need a Line of Credit in the target currency. If your migration requires Line of Credit billing, attach your existing USD Line of Credit.
  • You are billed in your WABA's currency. Your WABA's currency and your legal entity's headquarters address together determine which Meta billing entity issues your invoices.
  • Phone number limits are preserved on the new WABA (for example, expanded limits of up to 1,200 numbers carry over).
API CallWhat is migratedWhat is not migratedResultCan WABA be used to send messages?
First call (Initiate)* Templates (all statuses: Approved, Pending, Disabled, Rejected, Under Review) * Flows * App installation * Users/permissions* Templates with outdated formats * Phone numbers in "manual review" state * Insights/analyticsNew WABA in selected currency, with assets migratedNot yet – No phone number attached
Second call (Complete)Phone numbersHistorical insights (remain on old WABA)Phone number migrated to this new WABAYes
InsightsBefore MigrationAfter Migration
Phone InsightsAvailable on old WABAHistorical data remains on old WABA. New data appears on the new WABA after migration.
Template InsightsAvailable on old WABAHistorical data remains on old WABA. New template analytics appear on new WABA.
Message Insights (send, delivery)Available on old WABAHistorical data remains on old WABA. New message data appears on the new WABA.
Pricing Insights (cost, volume)Available on old WABAHistorical cost and volume data remains on old WABA. New billing data appears on the new WABA in the new currency.
Call Insights (cost, duration, count)Available on old WABAHistorical call data remains on old WABA. New call data appears on the new WABA.

Template migration behavior

During migration, note the following behavior:

  • New templates created on the old WABA after the phone migration will not be cloned to the new WABA.
  • Template status and category are locked during the migration process. Once migration is complete, both can change again.

Prerequisites

Before initiating a migration, ensure the following:

  • You have admin access to the source WABA.
  • You have a valid access token with whatsapp_business_management and whatsapp_business_messaging permissions. No additional Business Portfolio Admin permissions or business approvals are required.
  • If your migration requires Line of Credit billing, have your Line of Credit (also called a CreditLine) identifier ready to provide during the Complete migration step. Lines of Credit are always denominated in USD, so you do not need one in the target currency.

Initiate migration

Use the POST /<WHATSAPP_BUSINESS_ACCOUNT_ID>/set_payment_method_migration_intent endpoint to initiate the migration process. This validates the source WABA, creates a cloned WABA, and begins migrating assets such as templates and Flows.

Request syntax

curl -X POST "https://graph.facebook.com/<API_VERSION>/<WHATSAPP_BUSINESS_ACCOUNT_ID>/set_payment_method_migration_intent" \  
-H "Authorization: Bearer <ACCESS_TOKEN>" \  
-H "Content-Type: application/json" \  
-d '  
{  
  "currency": "<CURRENCY>",  
  
  <!-- Optional -->  
  "extended_credit_id": "<EXTENDED_CREDIT_ID>"  
}'

Response syntax

{  
  "migration_id": "<MIGRATION_ID>",  
  "migration_status": "<MIGRATION_STATUS>"  
}

Request parameters

PlaceholderDescriptionExample Value
<WHATSAPP_BUSINESS_ACCOUNT_ID>The source WhatsApp Business account (WABA) ID you are initiating migration from. Used in the endpoint path.123456789012345
<ACCESS_TOKEN>Access token with permissions to manage the WABA and perform migration actions. Used in the Authorization header.EAABsbCS1iHgBA...
<CURRENCY>Required. Target currency for the cloned (new) WABA.INR
<EXTENDED_CREDIT_ID>Optional. Line of Credit identifier. Required only if migrating to Line of Credit billing. If the WABA uses credit card billing, omit this parameter — migration works regardless of the current payment method.987654321098765

Example request

curl 'https://graph.facebook.com/v23.0/123456789012345/set_payment_method_migration_intent' \  
-H 'Content-Type: application/json' \  
-H 'Authorization: Bearer EAABsbCS1iHgBA...' \  
-d '  
{  
  "currency": "INR",  
  "extended_credit_id": "987654321098765"  
}'

Example response

{  
  "migration_id": "mig_01HZYK3ABCDEF4567890",  
  "migration_status": "INITIATED"  
}

Check migration status

Use the GET /<MIGRATION_ID> endpoint to check the current status of a migration. Poll this endpoint to monitor progress until the status reaches READY_TO_COMPLETE or COMPLETED.

Request syntax

curl 'https://graph.facebook.com/<API_VERSION>/<MIGRATION_ID>' \  
-H 'Authorization: Bearer <ACCESS_TOKEN>'

Request parameters

PlaceholderDescriptionExample Value
<MIGRATION_ID> StringRequired. The migration_id returned by the initiate migration endpoint.mig_01HZYK3ABCDEF4567890

Example request

curl 'https://graph.facebook.com/v23.0/mig_01HZYK3ABCDEF4567890' \  
-H 'Authorization: Bearer EAABsbCS1iHgBA...'

Example response

{  
  "status": "READY_TO_COMPLETE",  
  "destination_waba": {  
    "id": "998877665544332",  
    "name": "Acme WABA (INR)",  
    "currency": "INR",  
    "timezone_id": "1",  
    "message_template_namespace": "1234abcd_namespace"  
  },  
  "id": "mig_01HZYK3ABCDEF4567890"  
}

Pre-completion verification

Before completing the migration, verify the following on the new (destination) WABA:

  • Templates: Confirm that your templates have been cloned to the new WABA. Templates with outdated formats may not migrate. Note that template IDs on the new WABA will differ from the original WABA.
  • App installation: Verify that your app is installed on the new WABA.
  • Users: Confirm that users and permissions have been synced correctly to the new WABA.

Once you have verified these items, proceed to Complete migration.

Complete migration

Once the migration status reaches READY_TO_COMPLETE, call the resume migration endpoint as the final step. This detaches phone numbers from the old WABA and attaches them to the new WABA.

Prerequisites

Before completing the migration:

  • Verify that the migration status is READY_TO_COMPLETE by checking the migration status.
  • The new currency in the input is not the same as the existing currency on the WABA.
  • If your migration requires Line of Credit billing, have your CreditLine identifier ready to attach.

After this step completes:

  • The new WABA becomes the active account with the migrated phone numbers.
  • The old WABA can no longer send messages.
  • Continue referencing the old WABA for historical insights and analytics.

Request syntax

curl -X POST "https://graph.facebook.com/<API_VERSION>/<MIGRATION_ID>/resume_migration" \  
-H "Authorization: Bearer <ACCESS_TOKEN>"

Response example

{  
  "status": "<STATUS>",  
  "destination_waba": {  
    "id": "<CLONED_WABA_ID>",  
    "name": "<CLONED_WABA_NAME>",  
    "currency": "<NEW_CURRENCY>",  
    "timezone_id": "<CLONED_WABA_TIMEZONE>",  
    "message_template_namespace": "<NAMESPACE_FOR_TEMPLATES>"  
  },  
  "id": "<MIGRATION_ID>"  
}

Verify migration

After the migration status is COMPLETED, run these checks to confirm the new WABA is operational.

WABA cloning and asset migration

  • In Meta Business Suite, under WhatsApp Accounts, verify you see two WABAs: the original (original currency) and the new WABA (new currency).
  • In the new WABA, verify that templates have been migrated.
  • Confirm all phone numbers that were on the original WABA are now attached to the new WABA.

Messaging validation

  • Send a test message from the new WABA using one of the migrated phone numbers.
  • Confirm the message is delivered successfully and that message and cost insights appear under the new WABA.

Insights and analytics after migration

Insights and analytics do not migrate to the new WABA. The original WABA is not deleted — it remains visible in all linked Business Managers for historical reference. After migration:

  • Historical data: Continue querying the old WABA ID for all historical insights, analytics, and billing data generated before the migration.
  • New data: All new messaging insights, analytics, and billing data will appear under the new WABA ID after migration is complete.

Original WABA after migration

The original WABA is not deleted after migration. It remains visible in all linked Business Managers and accessible for historical reference. There is no plan to automatically delete original WABAs.

  • The original WABA can no longer send messages after the migration is complete.
  • All historical insights, analytics, and billing data remain on the original WABA.
  • The new WABA becomes the active account with migrated phone numbers and assets.

Migration status values

The following status values are returned by the migration API. For error statuses, see the recommended actions in the Troubleshooting section below.

StatusDescription
INITIATEDMigration has been initiated. The system is validating the source WABA and beginning asset cloning.
ACCEPTEDMigration request has been accepted and is queued for processing.
IN_PROGRESSAssets such as templates and Flows are being cloned to the new WABA.
READY_TO_COMPLETEAsset cloning is finished. You can now call the resume migration endpoint to complete the migration.
COMPLETEDMigration is complete. Phone numbers have been moved to the new WABA.
FAILEDMigration failed during asset cloning.
FAILED_TO_COMPLETEMigration failed during the final completion step (phone number move).
REJECTEDMigration request was rejected due to validation errors.

Troubleshooting

StatusIssuePossible reasons and solutions
REJECTEDMigration request was rejected due to validation errors.Verify that you have admin access to the source WABA and that your access token has the required permissions. Check that the source WABA is eligible for migration and retry.
FAILEDMigration failed during asset cloning (templates, Flows).Initiate a new migration by calling the set_payment_method_migration_intent endpoint again. If the issue persists, contact support.
FAILED_TO_COMPLETEMigration failed during the final completion step (phone number move).Call the resume migration endpoint again to retry. If the issue persists, contact support.
IN_PROGRESS (extended)Migration has been in progress longer than expected.Continue polling the check migration status endpoint. Migration duration varies depending on the number of templates and assets. If the status does not change after an extended period, contact support.

Unofficial mirror for reference/search purposes. All content originates from developers.facebook.com — see the source link at the top of each page. Machine-readable indexes: llms.txt · llms-full.txt · About