{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/product/account-setup/sidebars.yaml","api-docs-api-reference/@latest/index.yaml":"api-docs-api-reference/@latest/index.yaml"},"props":{"metadata":{"markdoc":{"tagList":["sub-header","admonition","tabs","tab","openapi-code-sample"]},"type":"markdown"},"seo":{"title":"Authorisation code grant flow","siteUrl":"https://docs.wise.com","projectTitle":"Wise Platform","description":"Explains how to programmatically create an account and profiles via API for Correspondent and Enterprise partners."},"dynamicMarkdocComponents":["openapi"],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"authorisation-code-grant-flow","__idx":0},"children":["Authorisation code grant flow"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"span","attributes":{"class":"sub-header"},"children":["Create an account and profiles with the Wise.com interface"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When using the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://wise.com/register#/email"},"children":["Wise.com interface"]}," to create an account and related profiles, you perform the following basic steps:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Register for an account."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create personal and business profiles."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Authorise access to your application via OAuth."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Capture the authorisation code."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Exchange the authorisation code for tokens."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Wise reviews the profiles and may request additional details and related documents, if necessary."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-1-register-for-an-account","__idx":1},"children":["Step 1: Register for an account"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To register for a Wise account:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Go to ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://wise.com/register#/email"},"children":["Wise.com"]}," and select ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sign up"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enter an appropriate business email address."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Select ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Business account"]}," as your account type."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Select the country where your business is registered (or where you pay taxes, if unregistered)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verify the phone number for two-factor authentication (be sure to use an appropriate mobile phone number that can receive 2FA notifications)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create your password."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Make note of the username and password created in this step. You will need them during the OAuth flow."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Phone number already used"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the phone number entered during account signup is already used on a personal Wise account, you may be blocked from creating the new account. In this case, contact your Wise implementation team to have the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dup-override"]}," tag applied to the account."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-2-create-personal-and-business-profiles","__idx":2},"children":["Step 2: Create personal and business profiles"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once logged in, set up a personal profile using the details of the person designated as the authorised signatory during your onboarding."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Then, create a business profile. Ensure you enter your registered business name and an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["actively monitored email address"]}," accessible to your back office team for handling RFIs."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Wise interface will guide you through providing business details, director information, UBO information, and identity verification."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Access for additional users"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can give other trusted users access to the business profile with specific permissions. Review our ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://wise.com/help/articles/2977953/how-do-i-add-or-remove-team-members"},"children":["help article about adding team members"]}," for detailed instructions."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-3-authorise-access-to-your-application-via-oauth","__idx":3},"children":["Step 3: Authorise access to your application via OAuth"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After setting up the profiles, grant your application access to the Wise account through a browser-based consent flow."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"redirect-to-wise-authorisation-page","__idx":4},"children":["Redirect to Wise authorisation page"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Paste the Wise authorisation URL into your browser, replacing the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<CLIENT_ID>"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<REDIRECT_URI>"]}," with the corresponding values:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"https://wise.com/oauth/authorize?response_type=code&client_id=<CLIENT_ID>&redirect_uri=<REDIRECT_URI>\n"},"children":[]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<CLIENT_ID>"]}," is your application's client ID."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<REDIRECT_URI>"]}," is the callback URI Wise provided."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Log in using the username and password you created when registering for the account. When prompted, grant access to your application."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-4-capture-authorization-code","__idx":5},"children":["Step 4: Capture authorization code"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After granting access, Wise redirects back to your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["redirect_uri"]}," with an authorisation code in the URL's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["code"]}," query parameter:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"https://your-redirect-uri.com/callback?code=<AUTHORIZATION_CODE>\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Your application should capture the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["code"]}," parameter from this redirect URL."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Sandbox testing behaviour"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note that when testing this flow in the sandbox, upon redirect you'll see a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["site can't be reached"]}," page. ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["This is expected behavior"]},". The authorization code, however, is available in the URL."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-5-exchange-auth-code-for-tokens","__idx":6},"children":["Step 5: Exchange auth code for tokens"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To exchange the authorisation code for a user access token, send a ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api-reference/oauth-token/oauthtokencreate"},"children":["create OAuth token request"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grant_type"]}," set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["authorization_code"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST https://api.wise.com/oauth/token \\\n  -u '<client_id>:<client_secret>' \\\n  -d 'grant_type=authorization_code' \\\n  -d 'client_id=<client_id>' \\\n  -d 'code=<authorization_code>' \\\n  -d 'redirect_uri=<redirect_uri>'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Required data for this request:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_secret"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grant_type"]}," is always ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["authorization_code"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["code"]}," is the authorization code value from the callback URL"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["redirect_uri"]}," is the Wise-provided redirect URL"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The response includes:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["access_token"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The user access token, valid for ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["12 hours"]}," by default."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["refresh_token"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A long-lived token, valid for ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["20 years"]}," by default, used to generate new user access tokens."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Store the refresh token securely and ensure it is never visible to a human. Using a vault service is generally ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/developer/auth-and-security#security-best-practices"},"children":["good practice"]}," to ensure token security as well as accessibility throughout your systems."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"verification-and-activation","__idx":7},"children":["Verification and activation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Wise reviews the profiles and informs you when the account is fully verified and ready for use."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In some cases, Wise may request additional verification documents for enhanced due diligence (EDD). If additional verification is requested, use the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api-reference/verification/verificationuploadevidences"},"children":["upload evidences endpoint"]}," to send the requested data, and use the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api-reference/verification/verificationuploaddocument"},"children":["upload documentation endpoint"]}," to send related documentation."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Do not use the account until Wise notifies you that verification is complete."]}]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Evidences example","disable":false},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note that the request bodies vary depending on whether the evidence is for a personal or business profile."]},{"$$mdtype":"Tag","name":"OpenApiCodeSample","attributes":{"descriptionFile":"api-docs-api-reference/@latest/index.yaml","operationId":"verificationUploadEvidences","parameters":{},"environments":{},"codeSamplesResolved":[{"lang":"shell","title":"curl","source":"curl -i -X POST \\\n  'https://api.wise.com/2026Q3/profiles/{profileId}/additional-verification/upload-evidences' \\\n  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \\\n  -H 'Content-Type: application/json' \\\n  -H 'X-External-Correlation-Id: f47ac10b-58cc-4372-a567-0e02b2c3d479' \\\n  -d '{\n    \"accountPurpose\": \"MOVING_SAVINGS\",\n    \"intendedCountries\": [\n      \"deu\",\n      \"esp\"\n    ],\n    \"yearlyAnticipatedVolume\": \"0_2350\",\n    \"mainSourceOfIncome\": \"SALARY\",\n    \"annualIncome\": \"0_11500\"\n  }'"},{"lang":"javascript","title":"JavaScript","source":"const profileId = 'YOUR_profileId_PARAMETER';\nconst resp = await fetch(\n  `https://api.wise.com/2026Q3/profiles/${profileId}/additional-verification/upload-evidences`,\n  {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      'X-External-Correlation-Id': 'f47ac10b-58cc-4372-a567-0e02b2c3d479',\n      Authorization: 'Bearer <YOUR_JWT_HERE>'\n    },\n    body: JSON.stringify({\n      accountPurpose: 'MOVING_SAVINGS',\n      intendedCountries: ['deu', 'esp'],\n      yearlyAnticipatedVolume: '0_2350',\n      mainSourceOfIncome: 'SALARY',\n      annualIncome: '0_11500'\n    })\n  }\n);\n\nconst data = await resp.json();\nconsole.log(data);"},{"lang":"javascript","title":"Node.js","source":"import fetch from 'node-fetch';\n\nasync function run() {\n  const profileId = 'YOUR_profileId_PARAMETER';\n  const resp = await fetch(\n    `https://api.wise.com/2026Q3/profiles/${profileId}/additional-verification/upload-evidences`,\n    {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'X-External-Correlation-Id': 'f47ac10b-58cc-4372-a567-0e02b2c3d479',\n        Authorization: 'Bearer <YOUR_JWT_HERE>'\n      },\n      body: JSON.stringify({\n        accountPurpose: 'MOVING_SAVINGS',\n        intendedCountries: ['deu', 'esp'],\n        yearlyAnticipatedVolume: '0_2350',\n        mainSourceOfIncome: 'SALARY',\n        annualIncome: '0_11500'\n      })\n    }\n  );\n\n  const data = await resp.json();\n  console.log(data);\n}\n\nrun();"},{"lang":"python","title":"Python","source":"import requests\n\nprofile_id = \"YOUR_profileId_PARAMETER\"\nurl = \"https://api.wise.com/2026Q3/profiles/\" + profile_id + \"/additional-verification/upload-evidences\"\n\npayload = {\n  \"accountPurpose\": \"MOVING_SAVINGS\",\n  \"intendedCountries\": [\n    \"deu\",\n    \"esp\"\n  ],\n  \"yearlyAnticipatedVolume\": \"0_2350\",\n  \"mainSourceOfIncome\": \"SALARY\",\n  \"annualIncome\": \"0_11500\"\n}\n\nheaders = {\n  \"Content-Type\": \"application/json\",\n  \"X-External-Correlation-Id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n  \"Authorization\": \"Bearer <YOUR_JWT_HERE>\"\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\n\ndata = response.json()\nprint(data)"},{"lang":"java","title":"Java","source":"import java.net.*;\nimport java.net.http.*;\nimport java.util.*;\n\npublic class App {\n  public static void main(String[] args) throws Exception {\n    var httpClient = HttpClient.newBuilder().build();\n\n    var payload = String.join(\"\\n\"\n      , \"{\"\n      , \" \\\"accountPurpose\\\": \\\"MOVING_SAVINGS\\\",\"\n      , \" \\\"intendedCountries\\\": [\"\n      , \"  \\\"deu\\\",\"\n      , \"  \\\"esp\\\"\"\n      , \" ],\"\n      , \" \\\"yearlyAnticipatedVolume\\\": \\\"0_2350\\\",\"\n      , \" \\\"mainSourceOfIncome\\\": \\\"SALARY\\\",\"\n      , \" \\\"annualIncome\\\": \\\"0_11500\\\"\"\n      , \"}\"\n    );\n\n    var host = \"https://api.wise.com\";\n    var profileId = \"YOUR_profileId_PARAMETER\";\n    var pathname = \"/2026Q3/profiles/%7BprofileId%7D/additional-verification/upload-evidences\";\n    var request = HttpRequest.newBuilder()\n      .POST(HttpRequest.BodyPublishers.ofString(payload))\n      .uri(URI.create(host + pathname ))\n      .header(\"Content-Type\", \"application/json\")\n      .header(\"X-External-Correlation-Id\", \"f47ac10b-58cc-4372-a567-0e02b2c3d479\")\n      .header(\"Authorization\", \"Bearer <YOUR_JWT_HERE>\")\n      .build();\n\n    var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());\n\n    System.out.println(response.body());\n  }\n}"},{"lang":"csharp","title":"C#","source":"using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Text;\nusing System.Text.Json;\n\npublic class Program\n{\n  public static async Task Main()\n  {\n    System.Net.Http.HttpClient client = new()\n    {\n      DefaultRequestHeaders =\n      {\n        {\"X-External-Correlation-Id\", \"f47ac10b-58cc-4372-a567-0e02b2c3d479\"},\n        {\"Authorization\", \"Bearer <YOUR_JWT_HERE>\"},\n      }\n    };\n\n    string json = JsonSerializer.Serialize(new\n    {\n      accountPurpose = \"MOVING_SAVINGS\",\n      intendedCountries = new[] {\n        \"deu\",\n        \"esp\"\n      },\n      yearlyAnticipatedVolume = \"0_2350\",\n      mainSourceOfIncome = \"SALARY\",\n      annualIncome = \"0_11500\"\n    });\n\n    using StringContent postData = new(json, Encoding.UTF8, \"application/json\");\n      var ProfileId = \"YOUR_profileId_PARAMETER\";\n    using HttpResponseMessage request = await client.PostAsync(\"https://api.wise.com/2026Q3/profiles/\" + ProfileId + \"/additional-verification/upload-evidences\", postData);\n    string response = await request.Content.ReadAsStringAsync();\n\n    Console.WriteLine(response);\n  }\n}"},{"lang":"php","title":"PHP","source":"/**\n * Requires libcurl\n */\n\nconst profileId = \"YOUR_profileId_PARAMETER\";\n$curl = curl_init();\n\n$payload = array(\n  \"accountPurpose\" => \"MOVING_SAVINGS\",\n  \"intendedCountries\" => array(\n    \"deu\",\n    \"esp\"\n  ),\n  \"yearlyAnticipatedVolume\" => \"0_2350\",\n  \"mainSourceOfIncome\" => \"SALARY\",\n  \"annualIncome\" => \"0_11500\"\n);\n\ncurl_setopt_array($curl, [\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer <YOUR_JWT_HERE>\",\n    \"Content-Type: application/json\",\n    \"X-External-Correlation-Id: f47ac10b-58cc-4372-a567-0e02b2c3d479\"\n  ],\n  CURLOPT_POSTFIELDS => json_encode($payload),\n  CURLOPT_URL => \"https://api.wise.com/2026Q3/profiles/\" . profileId . \"/additional-verification/upload-evidences\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_CUSTOMREQUEST => \"POST\",\n]);\n\n$response = curl_exec($curl);\n$error = curl_error($curl);\n\ncurl_close($curl);\n\nif ($error) {\n  echo \"cURL Error #:\" . $error;\n} else {\n  echo $response;\n}"},{"lang":"go","title":"Go","source":"package main\n\nimport (\n  \"fmt\"\n  \"bytes\"\n  \"net/http\"\n  \"io/ioutil\"\n)\n\nfunc main() {\n  profileId := \"YOUR_profileId_PARAMETER\";\n  reqUrl := \"https://api.wise.com/2026Q3/profiles/\" + profileId + \"/additional-verification/upload-evidences\"\n  var data = []byte(`{\n    \"accountPurpose\": \"MOVING_SAVINGS\",\n    \"intendedCountries\": [\n      \"deu\",\n      \"esp\"\n    ],\n    \"yearlyAnticipatedVolume\": \"0_2350\",\n    \"mainSourceOfIncome\": \"SALARY\",\n    \"annualIncome\": \"0_11500\"\n  }`)\n  req, err := http.NewRequest(\"POST\", reqUrl, bytes.NewBuffer(data))\n  if err != nil {\n    panic(err)\n  }\n  req.Header.Add(\"Content-Type\", \"application/json\")\n  req.Header.Add(\"X-External-Correlation-Id\", \"f47ac10b-58cc-4372-a567-0e02b2c3d479\")\n  req.Header.Add(\"Authorization\", \"Bearer <YOUR_JWT_HERE>\")\n  res, err := http.DefaultClient.Do(req)\n  if err != nil {\n    panic(err)\n  }\n  defer res.Body.Close()\n  body, err := ioutil.ReadAll(res.Body)\n  if err != nil {\n    panic(err)\n  }\n\n  fmt.Println(res)\n  fmt.Println(string(body))\n}"},{"lang":"ruby","title":"Ruby","source":"require 'json'\nrequire 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nprofile_id = 'YOUR_profileId_PARAMETER'\nurl = URI('https://api.wise.com/2026Q3/profiles/' + profile_id + '/additional-verification/upload-evidences')\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\n\nrequest = Net::HTTP::Post.new(url)\nrequest['Content-Type'] = 'application/json'\nrequest['X-External-Correlation-Id'] = 'f47ac10b-58cc-4372-a567-0e02b2c3d479'\nrequest['Authorization'] = 'Bearer <YOUR_JWT_HERE>'\nrequest.body = {\n  accountPurpose: 'MOVING_SAVINGS',\n  intendedCountries: ['deu', 'esp'],\n  yearlyAnticipatedVolume: '0_2350',\n  mainSourceOfIncome: 'SALARY',\n  annualIncome: '0_11500'\n}.to_json\n\nresponse = http.request(request)\nputs response.read_body\n"},{"lang":"r","title":"R","source":"library(httr)\n\nbody = '{\n   \"accountPurpose\": \"MOVING_SAVINGS\",\n   \"intendedCountries\": [\n    \"deu\",\n    \"esp\"\n   ],\n   \"yearlyAnticipatedVolume\": \"0_2350\",\n   \"mainSourceOfIncome\": \"SALARY\",\n   \"annualIncome\": \"0_11500\"\n}'\n\nprofile_id = \"YOUR_profileId_PARAMETER\"\n\n# create you own operator\n\"%&%\" <- function(x, y)paste0(x,y)\n\nurl = \"https://api.wise.com/2026Q3/profiles/\" %&% profile_id %&% \"/additional-verification/upload-evidences\"\n\ndata_req <- POST(\n  url,\n  add_headers(\"Content-Type\" = \"application/json\", \"X-External-Correlation-Id\" = \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"Authorization\" = \"Bearer <YOUR_JWT_HERE>\"),\n  body = body,\n  encode = \"json\",\n  verbose()\n)\n\ncontent(data_req)"},{"lang":"json","title":"Payload application/json","source":"{\n  \"accountPurpose\": \"MOVING_SAVINGS\",\n  \"intendedCountries\": [\n    \"deu\",\n    \"esp\"\n  ],\n  \"yearlyAnticipatedVolume\": \"0_2350\",\n  \"mainSourceOfIncome\": \"SALARY\",\n  \"annualIncome\": \"0_11500\"\n}"}]},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Documents example","disable":false},"children":[{"$$mdtype":"Tag","name":"OpenApiCodeSample","attributes":{"descriptionFile":"api-docs-api-reference/@latest/index.yaml","operationId":"verificationUploadDocument","parameters":{},"environments":{},"codeSamplesResolved":[{"lang":"shell","title":"curl","source":"curl -i -X POST \\\n  'https://api.wise.com/2026Q3/profiles/{profileId}/verification-status/upload-document' \\\n  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \\\n  -H 'Content-Type: multipart/form-data' \\\n  -H 'X-External-Correlation-Id: f47ac10b-58cc-4372-a567-0e02b2c3d479' \\\n  -F files=@/Users/test/file.png \\\n  -F documentType=SOURCE_OF_WEALTH"},{"lang":"javascript","title":"JavaScript","source":"const form = new FormData();\nform.append(\"files\", \"@/Users/test/file.png\");\nform.append(\"documentType\", \"SOURCE_OF_WEALTH\");\n\nconst profileId = 'YOUR_profileId_PARAMETER';\nconst resp = await fetch(\n  `https://api.wise.com/2026Q3/profiles/${profileId}/verification-status/upload-document`,\n  {\n    method: 'POST',\n    headers: {\n      'X-External-Correlation-Id': 'f47ac10b-58cc-4372-a567-0e02b2c3d479',\n      Authorization: 'Bearer <YOUR_JWT_HERE>'\n    },\n    body: form\n  }\n);\n\nif (resp.status === 204) {\n  console.log('success');\n} else {\n  const data = await resp.text();\n  console.log(data);\n}"},{"lang":"javascript","title":"Node.js","source":"import FormData from 'form-data';\nimport fetch from 'node-fetch';\n\nasync function run() {\n  const form = new FormData();\n  form.append('files', '@/Users/test/file.png');\n  form.append('documentType', 'SOURCE_OF_WEALTH');\n\n  const profileId = 'YOUR_profileId_PARAMETER';\n  const resp = await fetch(\n    `https://api.wise.com/2026Q3/profiles/${profileId}/verification-status/upload-document`,\n    {\n      method: 'POST',\n      headers: {\n        'X-External-Correlation-Id': 'f47ac10b-58cc-4372-a567-0e02b2c3d479',\n        Authorization: 'Bearer <YOUR_JWT_HERE>'\n      },\n      body: form\n    }\n  );\n\n  if (resp.status === 204) {\n    console.log('success');\n  } else {\n    const data = await resp.text();\n    console.log(data);\n  }\n}\n\nrun();"},{"lang":"python","title":"Python","source":"import requests\n\nprofile_id = \"YOUR_profileId_PARAMETER\"\nurl = \"https://api.wise.com/2026Q3/profiles/\" + profile_id + \"/verification-status/upload-document\"\n\ndata = {\n  \"files\": \"@/Users/test/file.png\",\n  \"documentType\": \"SOURCE_OF_WEALTH\"\n}\n\nheaders = {\n  \"Content-Type\": \"multipart/form-data\",\n  \"X-External-Correlation-Id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n  \"Authorization\": \"Bearer <YOUR_JWT_HERE>\"\n}\n\nresponse = requests.post(url, data=data, headers=headers)\n\nif response.status_code == 204:\n  print(\"success\")\nelse:\n  data = response.json()\n  print(data)"},{"lang":"java","title":"Java","source":"import java.net.*;\nimport java.net.http.*;\nimport java.util.*;\n\npublic class App {\n  public static void main(String[] args) throws Exception {\n    var httpClient = HttpClient.newBuilder().build();\n\n    var multipartBody = MultipartBodyPublisher.newBuilder();\n    multipartBody.append(\"files\", \"@/Users/test/file.png\");\n    multipartBody.append(\"documentType\", \"SOURCE_OF_WEALTH\");\n    var body = multipartBody.build();\n\n    var host = \"https://api.wise.com\";\n    var profileId = \"YOUR_profileId_PARAMETER\";\n    var pathname = \"/2026Q3/profiles/%7BprofileId%7D/verification-status/upload-document\";\n    var request = HttpRequest.newBuilder()\n      .POST(HttpRequest.BodyPublishers.ofString(payload))\n      .uri(URI.create(host + pathname ))\n      .header(\"Content-Type\", \"multipart/form-data\")\n      .header(\"X-External-Correlation-Id\", \"f47ac10b-58cc-4372-a567-0e02b2c3d479\")\n      .header(\"Authorization\", \"Bearer <YOUR_JWT_HERE>\")\n      .build();\n\n    var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());\n\n    System.out.println(response.body());\n  }\n}"},{"lang":"csharp","title":"C#","source":"using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\npublic class Program\n{\n  public static async Task Main()\n  {\n    System.Net.Http.HttpClient client = new()\n    {\n      DefaultRequestHeaders =\n      {\n        {\"X-External-Correlation-Id\", \"f47ac10b-58cc-4372-a567-0e02b2c3d479\"},\n        {\"Authorization\", \"Bearer <YOUR_JWT_HERE>\"},\n      }\n    };\n\n\n    MultipartFormDataContent postData = new MultipartFormDataContent();\n    postData.Add(new StringContent(\"@/Users/test/file.png\"), \"files\");\n    postData.Add(new StringContent(\"SOURCE_OF_WEALTH\"), \"documentType\");\n      var ProfileId = \"YOUR_profileId_PARAMETER\";\n    using HttpResponseMessage request = await client.PostAsync(\"https://api.wise.com/2026Q3/profiles/\" + ProfileId + \"/verification-status/upload-document\", postData);\n    string response = await request.Content.ReadAsStringAsync();\n\n    Console.WriteLine(response);\n  }\n}"},{"lang":"php","title":"PHP","source":"/**\n * Requires libcurl\n */\n\nconst profileId = \"YOUR_profileId_PARAMETER\";\n$curl = curl_init();\n\n$payload = array(\n  \"files\" => \"@/Users/test/file.png\",\n  \"documentType\" => \"SOURCE_OF_WEALTH\",\n);\n\ncurl_setopt_array($curl, [\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer <YOUR_JWT_HERE>\",\n    \"Content-Type: multipart/form-data\",\n    \"X-External-Correlation-Id: f47ac10b-58cc-4372-a567-0e02b2c3d479\"\n  ],\n  CURLOPT_POSTFIELDS => $payload,\n  CURLOPT_URL => \"https://api.wise.com/2026Q3/profiles/\" . profileId . \"/verification-status/upload-document\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_CUSTOMREQUEST => \"POST\",\n]);\n\n$response = curl_exec($curl);\n$error = curl_error($curl);\n\ncurl_close($curl);\n\nif ($error) {\n  echo \"cURL Error #:\" . $error;\n} else {\n  echo $response;\n}"},{"lang":"go","title":"Go","source":"package main\n\nimport (\n  \"fmt\"\n  \"mime/multipart\"\n  \"io\"\n  \"bytes\"\n  \"strings\"\n  \"net/http\"\n  \"io/ioutil\"\n)\n\nfunc main() {\n  profileId := \"YOUR_profileId_PARAMETER\";\n  reqUrl := \"https://api.wise.com/2026Q3/profiles/\" + profileId + \"/verification-status/upload-document\"\n  data := &bytes.Buffer{}\n  writer := multipart.NewWriter(data)\n  filesFw, _ := writer.CreateFormField(\"files\")\n  _, err = io.Copy(filesFw, strings.NewReader(\"@/Users/test/file.png\"))\n  if err != nil {\n    panic(err)\n  }\n  documentTypeFw, _ := writer.CreateFormField(\"documentType\")\n  _, err = io.Copy(documentTypeFw, strings.NewReader(\"SOURCE_OF_WEALTH\"))\n  if err != nil {\n    panic(err)\n  }\n  writer.Close()\n\n  payload := bytes.NewReader(data.Bytes())\n  req, err := http.NewRequest(\"POST\", reqUrl, payload)\n  if err != nil {\n    panic(err)\n  }\n  req.Header.Add(\"Content-Type\", writer.FormDataContentType())\n  req.Header.Add(\"X-External-Correlation-Id\", \"f47ac10b-58cc-4372-a567-0e02b2c3d479\")\n  req.Header.Add(\"Authorization\", \"Bearer <YOUR_JWT_HERE>\")\n  res, err := http.DefaultClient.Do(req)\n  if err != nil {\n    panic(err)\n  }\n  defer res.Body.Close()\n  body, err := ioutil.ReadAll(res.Body)\n  if err != nil {\n    panic(err)\n  }\n\n  fmt.Println(res)\n  fmt.Println(string(body))\n}"},{"lang":"ruby","title":"Ruby","source":"require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nprofile_id = 'YOUR_profileId_PARAMETER'\nurl = URI('https://api.wise.com/2026Q3/profiles/' + profile_id + '/verification-status/upload-document')\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\n\nrequest = Net::HTTP::Post.new(url)\nrequest['X-External-Correlation-Id'] = 'f47ac10b-58cc-4372-a567-0e02b2c3d479'\nrequest['Authorization'] = 'Bearer <YOUR_JWT_HERE>'\nform_data = [\n  ['files', '@/Users/test/file.png'],\n  ['documentType', 'SOURCE_OF_WEALTH'],\n]\nrequest.set_form(form_data, 'multipart/form-data')\n\nresponse = http.request(request)\nputs response.read_body\n"},{"lang":"r","title":"R","source":"library(httr)\n\nbody <- list(\n  files = \"@/Users/test/file.png\",\n  documentType = \"SOURCE_OF_WEALTH\"\n)\n\nprofile_id = \"YOUR_profileId_PARAMETER\"\n\n# create you own operator\n\"%&%\" <- function(x, y)paste0(x,y)\n\nurl = \"https://api.wise.com/2026Q3/profiles/\" %&% profile_id %&% \"/verification-status/upload-document\"\n\ndata_req <- POST(\n  url,\n  add_headers(\"Content-Type\" = \"multipart/form-data\", \"X-External-Correlation-Id\" = \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"Authorization\" = \"Bearer <YOUR_JWT_HERE>\"),\n  body = body,\n  encode = \"multipart\",\n  verbose()\n)\n\ncontent(data_req)"},{"lang":"clike","title":"Payload multipart/form-data","source":"{\n  \"files\": \"@/Users/test/file.png\",\n  \"documentType\": \"SOURCE_OF_WEALTH\"\n}"}]},"children":[]}]}]}]},"headings":[{"value":"Authorisation code grant flow","id":"authorisation-code-grant-flow","depth":1},{"value":"Step 1: Register for an account","id":"step-1-register-for-an-account","depth":2},{"value":"Step 2: Create personal and business profiles","id":"step-2-create-personal-and-business-profiles","depth":2},{"value":"Step 3: Authorise access to your application via OAuth","id":"step-3-authorise-access-to-your-application-via-oauth","depth":2},{"value":"Redirect to Wise authorisation page","id":"redirect-to-wise-authorisation-page","depth":3},{"value":"Step 4: Capture authorization code","id":"step-4-capture-authorization-code","depth":2},{"value":"Step 5: Exchange auth code for tokens","id":"step-5-exchange-auth-code-for-tokens","depth":2},{"value":"Verification and activation","id":"verification-and-activation","depth":2}],"frontmatter":{"seo":{"description":"Explains how to programmatically create an account and profiles via API for Correspondent and Enterprise partners.","title":"Authorisation code grant flow"},"markdown":{"toc":{"depth":2}}},"lastModified":"2026-09-23T14:49:17.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/product/account-setup/auth-grant-flow","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}