curl --request PATCH \
--url https://api.rolla.xyz/api/v1/external/payer-names/{payerNameId} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"registration_number": "RC7654321",
"metadata": {
"vendor_id": "V-4471",
"ticket": "SUP-2291"
}
}
'import requests
url = "https://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}"
payload = {
"registration_number": "RC7654321",
"metadata": {
"vendor_id": "V-4471",
"ticket": "SUP-2291"
}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
registration_number: 'RC7654321',
metadata: {vendor_id: 'V-4471', ticket: 'SUP-2291'}
})
};
fetch('https://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}', 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://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'registration_number' => 'RC7654321',
'metadata' => [
'vendor_id' => 'V-4471',
'ticket' => 'SUP-2291'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}"
payload := strings.NewReader("{\n \"registration_number\": \"RC7654321\",\n \"metadata\": {\n \"vendor_id\": \"V-4471\",\n \"ticket\": \"SUP-2291\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.patch("https://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"registration_number\": \"RC7654321\",\n \"metadata\": {\n \"vendor_id\": \"V-4471\",\n \"ticket\": \"SUP-2291\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"registration_number\": \"RC7654321\",\n \"metadata\": {\n \"vendor_id\": \"V-4471\",\n \"ticket\": \"SUP-2291\"\n }\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"message": "Payer name updated and resubmitted for review",
"success": true,
"data": {
"id": "9f8e7d6c-5b4a-4938-8271-0a1b2c3d4e5f",
"type": "business",
"name": "Acme Trading Ltd",
"firstName": null,
"lastName": null,
"registrationNumber": "RC7654321",
"registrationDate": "2019-04-02",
"country": "NG",
"address": {
"line1": "14 Marina Road",
"city": "Lagos",
"state": "Lagos",
"postalCode": "101001"
},
"status": "pending_review",
"isDefault": false,
"decisionNote": null,
"documents": [
{
"id": "2b3c4d5e-6f70-4812-9a3b-4c5d6e7f8091",
"fileName": "certificate-of-incorporation.pdf",
"description": "Certificate of incorporation",
"fileType": "application/pdf",
"fileSize": 284122,
"downloadUrl": "https://files.rolla.xyz/payer_name_docs/...",
"createdAt": "2026-09-01T09:14:22.000Z"
}
],
"metadata": {
"vendor_id": "V-4471",
"ticket": "SUP-2291"
},
"createdAt": "2026-09-01T09:14:22.000Z",
"updatedAt": "2026-09-03T08:41:10.000Z"
}
}{
"status": 400,
"message": "Validation failed",
"code": "ACCOUNT_RESTRICTED",
"errors": [
{
"path": [
"amount"
],
"message": "amount must be a whole number of smallest currency units (e.g. cents)"
}
]
}{
"status": 400,
"message": "Validation failed",
"code": "ACCOUNT_RESTRICTED",
"errors": [
{
"path": [
"amount"
],
"message": "amount must be a whole number of smallest currency units (e.g. cents)"
}
]
}{
"status": 403,
"message": "Payer names are not enabled for this account. Contact your Rolla account manager to turn them on.",
"code": "PAYER_NAMES_DISABLED"
}{
"status": 404,
"message": "Payer name not found"
}{
"status": 409,
"message": "This payer name can no longer be edited (status: approved). Submit a new one instead."
}Update Payer Name
Corrects a payer name that is still in review or has had changes requested, and resubmits it. Every field is optional and omitted fields keep their current value. Any edit, including a metadata-only one, returns the name to pending_review and clears decisionNote. A name that is approved, rejected or archived cannot be edited — archive it and submit a new one. PATCH is the documented verb; PUT on the same path is an alias and behaves identically.
curl --request PATCH \
--url https://api.rolla.xyz/api/v1/external/payer-names/{payerNameId} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"registration_number": "RC7654321",
"metadata": {
"vendor_id": "V-4471",
"ticket": "SUP-2291"
}
}
'import requests
url = "https://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}"
payload = {
"registration_number": "RC7654321",
"metadata": {
"vendor_id": "V-4471",
"ticket": "SUP-2291"
}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
registration_number: 'RC7654321',
metadata: {vendor_id: 'V-4471', ticket: 'SUP-2291'}
})
};
fetch('https://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}', 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://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'registration_number' => 'RC7654321',
'metadata' => [
'vendor_id' => 'V-4471',
'ticket' => 'SUP-2291'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}"
payload := strings.NewReader("{\n \"registration_number\": \"RC7654321\",\n \"metadata\": {\n \"vendor_id\": \"V-4471\",\n \"ticket\": \"SUP-2291\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.patch("https://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"registration_number\": \"RC7654321\",\n \"metadata\": {\n \"vendor_id\": \"V-4471\",\n \"ticket\": \"SUP-2291\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rolla.xyz/api/v1/external/payer-names/{payerNameId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"registration_number\": \"RC7654321\",\n \"metadata\": {\n \"vendor_id\": \"V-4471\",\n \"ticket\": \"SUP-2291\"\n }\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"message": "Payer name updated and resubmitted for review",
"success": true,
"data": {
"id": "9f8e7d6c-5b4a-4938-8271-0a1b2c3d4e5f",
"type": "business",
"name": "Acme Trading Ltd",
"firstName": null,
"lastName": null,
"registrationNumber": "RC7654321",
"registrationDate": "2019-04-02",
"country": "NG",
"address": {
"line1": "14 Marina Road",
"city": "Lagos",
"state": "Lagos",
"postalCode": "101001"
},
"status": "pending_review",
"isDefault": false,
"decisionNote": null,
"documents": [
{
"id": "2b3c4d5e-6f70-4812-9a3b-4c5d6e7f8091",
"fileName": "certificate-of-incorporation.pdf",
"description": "Certificate of incorporation",
"fileType": "application/pdf",
"fileSize": 284122,
"downloadUrl": "https://files.rolla.xyz/payer_name_docs/...",
"createdAt": "2026-09-01T09:14:22.000Z"
}
],
"metadata": {
"vendor_id": "V-4471",
"ticket": "SUP-2291"
},
"createdAt": "2026-09-01T09:14:22.000Z",
"updatedAt": "2026-09-03T08:41:10.000Z"
}
}{
"status": 400,
"message": "Validation failed",
"code": "ACCOUNT_RESTRICTED",
"errors": [
{
"path": [
"amount"
],
"message": "amount must be a whole number of smallest currency units (e.g. cents)"
}
]
}{
"status": 400,
"message": "Validation failed",
"code": "ACCOUNT_RESTRICTED",
"errors": [
{
"path": [
"amount"
],
"message": "amount must be a whole number of smallest currency units (e.g. cents)"
}
]
}{
"status": 403,
"message": "Payer names are not enabled for this account. Contact your Rolla account manager to turn them on.",
"code": "PAYER_NAMES_DISABLED"
}{
"status": 404,
"message": "Payer name not found"
}{
"status": 409,
"message": "This payer name can no longer be edited (status: approved). Submit a new one instead."
}changes_requested decision.
Every field is optional; anything you omit keeps its current value. PUT /payer-names/{payerNameId} is accepted as an alias and behaves identically.
Example Request
curl -X PATCH "https://api.rolla.xyz/api/v1/external/payer-names/9f8e7d6c-5b4a-4938-8271-0a1b2c3d4e5f" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"registration_number": "RC7654321",
"metadata": { "vendor_id": "V-4471", "ticket": "SUP-2291" }
}'
Example Response
{
"status": 200,
"message": "Payer name updated and resubmitted for review",
"success": true,
"data": {
"id": "9f8e7d6c-5b4a-4938-8271-0a1b2c3d4e5f",
"type": "business",
"name": "Acme Trading Ltd",
"firstName": null,
"lastName": null,
"registrationNumber": "RC7654321",
"registrationDate": "2019-04-02",
"country": "NG",
"address": { "line1": "14 Marina Road", "city": "Lagos", "state": "Lagos", "postalCode": "101001" },
"status": "pending_review",
"isDefault": false,
"decisionNote": null,
"documents": [
{
"id": "2b3c4d5e-6f70-4812-9a3b-4c5d6e7f8091",
"fileName": "certificate-of-incorporation.pdf",
"description": "Certificate of incorporation",
"fileType": "application/pdf",
"fileSize": 284122,
"downloadUrl": "https://files.rolla.xyz/payer_name_docs/...",
"createdAt": "2026-09-01T09:14:22.000Z"
}
],
"metadata": { "vendor_id": "V-4471", "ticket": "SUP-2291" },
"createdAt": "2026-09-01T09:14:22.000Z",
"updatedAt": "2026-09-03T08:41:10.000Z"
}
}
What an update does
pending_review and clears decisionNote — including an edit that only touches metadata. There is no way to change a field without going back through review, so batch your corrections into one call.pending_review or changes_requested can be edited. Anything else answers 409:
| Current status | Result |
|---|---|
pending_review, changes_requested | Updated and resubmitted |
processing, active, action_required (all approved) | 409 — archive it and submit a new one |
rejected, archived | 409 — submit a new one |
display_name to a name you already have in review or approved answers 409 too.
Sandbox
As with Create Payer Name, a sandbox update is approved and activated immediately and comes back asactive.Authorizations
Your Rolla API key
Path Parameters
The payer name id.
Body
Fields to change on a payer name still in review. Every field is optional; omitted fields keep their current value. Any edit returns the name to pending_review and clears decisionNote.
Whether the payer is a company or a person.
individual, business "business"
The name the beneficiary sees. Must be unique among your payer names that are in review or approved, compared case-insensitively.
1 - 255"Acme Trading Ltd"
Individuals only. Send the name already split rather than letting us guess where to split it.
120Individuals only.
120Company registration number, or a government ID number for an individual.
120"RC1234567"
YYYY-MM-DD.
^\d{4}-\d{2}-\d{2}$"2019-04-02"
The payer's country. ISO 3166-1 alpha-2, or a country name we can resolve to one. Anything that does not resolve to two letters is rejected with a 400.
1 - 100"NG"
1 - 500"14 Marina Road"
1 - 120"Lagos"
1 - 120"Lagos"
32"101001"
Flat key/value data of your own, echoed back on responses and webhooks. Keys are at most 64 characters; values may be strings (max 500 characters), numbers or booleans. JSON requests only — a multipart request cannot carry it.
Show child attributes
Show child attributes
{ "vendor_id": "V-4471" }
Response
Payer name updated and resubmitted for review. In sandbox the message is Payer name updated and the name comes back as active.
HTTP status code, repeated in the body
200
"Payer name updated and resubmitted for review"
true
A payer name: the name a beneficiary sees on a payout you send. Responses are camelCase; request bodies are snake_case.
Show child attributes
Show child attributes