curl --request POST \
--url https://app.vortexiq.ai/v2/api/bc-migration/login \
--header 'Content-Type: application/json' \
--data '
{
"username": "Jane Merchant",
"email": "jane@example.com",
"organization_name": "Example Retail Ltd",
"client_id": "viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12",
"client_secret": "<client-secret>"
}
'import requests
url = "https://app.vortexiq.ai/v2/api/bc-migration/login"
payload = {
"username": "Jane Merchant",
"email": "jane@example.com",
"organization_name": "Example Retail Ltd",
"client_id": "viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12",
"client_secret": "<client-secret>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
username: 'Jane Merchant',
email: 'jane@example.com',
organization_name: 'Example Retail Ltd',
client_id: 'viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12',
client_secret: '<client-secret>'
})
};
fetch('https://app.vortexiq.ai/v2/api/bc-migration/login', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.vortexiq.ai/v2/api/bc-migration/login",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'username' => 'Jane Merchant',
'email' => 'jane@example.com',
'organization_name' => 'Example Retail Ltd',
'client_id' => 'viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12',
'client_secret' => '<client-secret>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.vortexiq.ai/v2/api/bc-migration/login"
payload := strings.NewReader("{\n \"username\": \"Jane Merchant\",\n \"email\": \"jane@example.com\",\n \"organization_name\": \"Example Retail Ltd\",\n \"client_id\": \"viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12\",\n \"client_secret\": \"<client-secret>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.vortexiq.ai/v2/api/bc-migration/login")
.header("Content-Type", "application/json")
.body("{\n \"username\": \"Jane Merchant\",\n \"email\": \"jane@example.com\",\n \"organization_name\": \"Example Retail Ltd\",\n \"client_id\": \"viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12\",\n \"client_secret\": \"<client-secret>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.vortexiq.ai/v2/api/bc-migration/login")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"username\": \"Jane Merchant\",\n \"email\": \"jane@example.com\",\n \"organization_name\": \"Example Retail Ltd\",\n \"client_id\": \"viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12\",\n \"client_secret\": \"<client-secret>\"\n}"
response = http.request(request)
puts response.read_body{
"user": {
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Merchant"
},
"organization": {
"id": 42,
"name": "Example Retail Ltd"
},
"stores": [
{
"integration_id": 101,
"store_hash": "abc123xyz",
"name": "Production Store",
"environment_type": "production",
"is_production": true
},
{
"integration_id": 102,
"store_hash": "def456uvw",
"name": "Staging Store",
"environment_type": "staging",
"is_production": false
}
],
"token_type": "Bearer",
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"expires_in": 864000,
"expires_at": "2026-07-27T14:46:16+00:00"
}{
"error": "invalid_credentials",
"message": "The provided username, email or organization name could not be validated."
}{
"error": "insufficient_stores",
"message": "At least 2 connected BigCommerce stores are required for this organization to use the migration API.",
"stores_found": 1
}{
"message": "The given data was invalid.",
"errors": {
"client_id": [
"The client id field is required."
]
}
}{
"error": "not_configured",
"message": "BC Migration API access is not configured on this environment."
}Exchange your identity (username, email, organisation name) and your organisation’s API credential (client_id + client_secret) for a bearer token valid for 10 days. The credential is issued per organisation by Vortex IQ — contact support to have one provisioned. The organisation must have Store Migration enabled and at least 2 connected BigCommerce stores (a migration needs a source and a destination). Rate limited to 10 requests per minute.
curl --request POST \
--url https://app.vortexiq.ai/v2/api/bc-migration/login \
--header 'Content-Type: application/json' \
--data '
{
"username": "Jane Merchant",
"email": "jane@example.com",
"organization_name": "Example Retail Ltd",
"client_id": "viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12",
"client_secret": "<client-secret>"
}
'import requests
url = "https://app.vortexiq.ai/v2/api/bc-migration/login"
payload = {
"username": "Jane Merchant",
"email": "jane@example.com",
"organization_name": "Example Retail Ltd",
"client_id": "viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12",
"client_secret": "<client-secret>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
username: 'Jane Merchant',
email: 'jane@example.com',
organization_name: 'Example Retail Ltd',
client_id: 'viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12',
client_secret: '<client-secret>'
})
};
fetch('https://app.vortexiq.ai/v2/api/bc-migration/login', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.vortexiq.ai/v2/api/bc-migration/login",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'username' => 'Jane Merchant',
'email' => 'jane@example.com',
'organization_name' => 'Example Retail Ltd',
'client_id' => 'viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12',
'client_secret' => '<client-secret>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.vortexiq.ai/v2/api/bc-migration/login"
payload := strings.NewReader("{\n \"username\": \"Jane Merchant\",\n \"email\": \"jane@example.com\",\n \"organization_name\": \"Example Retail Ltd\",\n \"client_id\": \"viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12\",\n \"client_secret\": \"<client-secret>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.vortexiq.ai/v2/api/bc-migration/login")
.header("Content-Type", "application/json")
.body("{\n \"username\": \"Jane Merchant\",\n \"email\": \"jane@example.com\",\n \"organization_name\": \"Example Retail Ltd\",\n \"client_id\": \"viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12\",\n \"client_secret\": \"<client-secret>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.vortexiq.ai/v2/api/bc-migration/login")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"username\": \"Jane Merchant\",\n \"email\": \"jane@example.com\",\n \"organization_name\": \"Example Retail Ltd\",\n \"client_id\": \"viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12\",\n \"client_secret\": \"<client-secret>\"\n}"
response = http.request(request)
puts response.read_body{
"user": {
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Merchant"
},
"organization": {
"id": 42,
"name": "Example Retail Ltd"
},
"stores": [
{
"integration_id": 101,
"store_hash": "abc123xyz",
"name": "Production Store",
"environment_type": "production",
"is_production": true
},
{
"integration_id": 102,
"store_hash": "def456uvw",
"name": "Staging Store",
"environment_type": "staging",
"is_production": false
}
],
"token_type": "Bearer",
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"expires_in": 864000,
"expires_at": "2026-07-27T14:46:16+00:00"
}{
"error": "invalid_credentials",
"message": "The provided username, email or organization name could not be validated."
}{
"error": "insufficient_stores",
"message": "At least 2 connected BigCommerce stores are required for this organization to use the migration API.",
"stores_found": 1
}{
"message": "The given data was invalid.",
"errors": {
"client_id": [
"The client id field is required."
]
}
}{
"error": "not_configured",
"message": "BC Migration API access is not configured on this environment."
}Body
Your name as registered on your Vortex IQ account (first name, last name, or full name — case-insensitive).
"Jane Merchant"
The email of your Vortex IQ user.
"jane@example.com"
Your organisation's name exactly as registered (case-insensitive). Your user must belong to this organisation.
"Example Retail Ltd"
Your organisation's API client id, issued by Vortex IQ.
"viq_bcmig_Ab12Cd34Ef56Gh78Ij90Kl12"
Your organisation's API client secret. Shown once at issue time; keep it server-side.
"<client-secret>"
Response
Authenticated. Send access_token as Authorization: Bearer <token> on every subsequent call.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The BigCommerce stores connected to your organisation. Use these store hashes on the migration endpoints.
Show child attributes
Show child attributes
"Bearer"
The bearer token (JWT). Treat it as a secret.
Token lifetime in seconds (864000 = 10 days).
864000
Absolute expiry time (ISO 8601).
Was this page helpful?