Overview
The Addresses API provides functionality for managing customer addresses including adding, editing, retrieving, and deleting addresses. Addresses are used for both payment (billing) and shipping (delivery) purposes.
Model Location: catalog/model/account/address.php
Add Address
Create a new address for a customer.
$this -> load -> model ( 'account/address' );
$address_id = $this -> model_account_address -> addAddress ( $customer_id , $data );
Parameters
Customer ID who owns this address
First name (1-32 characters)
Last name (1-32 characters)
Address line 1 (3-128 characters)
Postal/ZIP code (2-10 characters, if required by country)
Example Request
$address_data = [
'firstname' => 'John' ,
'lastname' => 'Doe' ,
'company' => 'Acme Corporation' ,
'address_1' => '123 Main Street' ,
'address_2' => 'Suite 100' ,
'postcode' => '10001' ,
'city' => 'New York' ,
'zone_id' => 3655 , // New York state
'country_id' => 223 , // United States
'custom_field' => [],
'default' => 1
];
$this -> load -> model ( 'account/address' );
$address_id = $this -> model_account_address -> addAddress ( $customer_id , $address_data );
echo "New address ID: " . $address_id ;
Response
Returns the new address ID (integer).
Edit Address
Update an existing address.
$this -> load -> model ( 'account/address' );
$this -> model_account_address -> editAddress ( $customer_id , $address_id , $data );
Parameters
Customer ID who owns the address
Address data (same fields as Add Address)
Example
$updated_address = [
'firstname' => 'John' ,
'lastname' => 'Doe' ,
'company' => 'New Company Inc' ,
'address_1' => '456 Oak Avenue' ,
'address_2' => 'Apt 5B' ,
'postcode' => '10002' ,
'city' => 'New York' ,
'zone_id' => 3655 ,
'country_id' => 223 ,
'custom_field' => [],
'default' => 0
];
$this -> model_account_address -> editAddress ( $customer_id , $address_id , $updated_address );
Get Address
Retrieve a specific address by ID.
$this -> load -> model ( 'account/address' );
$address_info = $this -> model_account_address -> getAddress ( $customer_id , $address_id );
Parameters
Response
Country ISO code (2 letters)
Country ISO code (3 letters)
JSON-encoded custom fields
Whether this is the default address
Example Response
{
"address_id" : 42 ,
"customer_id" : 123 ,
"firstname" : "John" ,
"lastname" : "Doe" ,
"company" : "Acme Corporation" ,
"address_1" : "123 Main Street" ,
"address_2" : "Suite 100" ,
"city" : "New York" ,
"postcode" : "10001" ,
"country_id" : 223 ,
"country" : "United States" ,
"iso_code_2" : "US" ,
"iso_code_3" : "USA" ,
"zone_id" : 3655 ,
"zone" : "New York" ,
"zone_code" : "NY" ,
"address_format" : "{firstname} {lastname} \n {company} \n {address_1} \n {address_2} \n {city}, {zone} {postcode} \n {country}" ,
"custom_field" : "{}" ,
"default" : true
}
Get Addresses
Retrieve all addresses for a customer.
$this -> load -> model ( 'account/address' );
$addresses = $this -> model_account_address -> getAddresses ( $customer_id );
Parameters
Response
Returns an array of address objects.
Example
$customer_id = 123 ;
$addresses = $this -> model_account_address -> getAddresses ( $customer_id );
foreach ( $addresses as $address ) {
echo $address [ 'address_id' ] . ': ' ;
echo $address [ 'firstname' ] . ' ' . $address [ 'lastname' ] . ', ' ;
echo $address [ 'city' ] . ', ' . $address [ 'zone' ];
if ( $address [ 'default' ]) {
echo ' (Default)' ;
}
echo " \n " ;
}
Delete Address
Delete an address.
$this -> load -> model ( 'account/address' );
$this -> model_account_address -> deleteAddresses ( $customer_id , $address_id );
Parameters
Example
$this -> model_account_address -> deleteAddresses ( $customer_id , $address_id );
Get Total Addresses
Get count of addresses for a customer.
$this -> load -> model ( 'account/address' );
$total = $this -> model_account_address -> getTotalAddresses ( $customer_id );
Example
$count = $this -> model_account_address -> getTotalAddresses ( 123 );
echo "Customer has { $count } saved addresses" ;
Default Address
When an address is set as default:
The new address gets default = 1
All other addresses for that customer get default = 0
Only one address per customer can be default
// Source: address.php:46-48
if ( ! empty ( $data [ 'default' ])) {
$this -> db -> query ( " UPDATE `" . DB_PREFIX . "address` SET `default` = '0'
WHERE `address_id` != '" . ( int ) $address_id . "'
AND `customer_id` = '" . ( int ) $customer_id . "'" );
}
Use in API Orders
Set Payment Address
// Get saved address
$this -> load -> model ( 'account/address' );
$address = $this -> model_account_address -> getAddress ( $customer_id , $address_id );
if ( $address ) {
// Use for payment address
$payment_data = [
'payment_firstname' => $address [ 'firstname' ],
'payment_lastname' => $address [ 'lastname' ],
'payment_company' => $address [ 'company' ],
'payment_address_1' => $address [ 'address_1' ],
'payment_address_2' => $address [ 'address_2' ],
'payment_city' => $address [ 'city' ],
'payment_postcode' => $address [ 'postcode' ],
'payment_country_id' => $address [ 'country_id' ],
'payment_zone_id' => $address [ 'zone_id' ],
'payment_custom_field' => json_decode ( $address [ 'custom_field' ], true )
];
$this -> load -> controller ( 'api/payment_address' , $payment_data );
}
Set Shipping Address
// Use saved address for shipping
$address = $this -> model_account_address -> getAddress ( $customer_id , $address_id );
if ( $address ) {
$shipping_data = [
'shipping_firstname' => $address [ 'firstname' ],
'shipping_lastname' => $address [ 'lastname' ],
'shipping_company' => $address [ 'company' ],
'shipping_address_1' => $address [ 'address_1' ],
'shipping_address_2' => $address [ 'address_2' ],
'shipping_city' => $address [ 'city' ],
'shipping_postcode' => $address [ 'postcode' ],
'shipping_country_id' => $address [ 'country_id' ],
'shipping_zone_id' => $address [ 'zone_id' ],
'shipping_custom_field' => json_decode ( $address [ 'custom_field' ], true )
];
$this -> load -> controller ( 'api/shipping_address' , $shipping_data );
}
Address format is country-specific:
// Example US format
"{firstname} {lastname}
{company}
{address_1}
{address_2}
{city}, {zone} {postcode}
{country}"
// Example UK format
"{firstname} {lastname}
{company}
{address_1}
{address_2}
{city}
{postcode}
{country}"
Complete Address Management Example
class AddressManager {
public function manageCustomerAddresses ( $customer_id ) {
$this -> load -> model ( 'account/address' );
// Get all addresses
$addresses = $this -> model_account_address -> getAddresses ( $customer_id );
if ( empty ( $addresses )) {
// Add first address
$address_id = $this -> addNewAddress ( $customer_id );
} else {
// Use existing default address
$default_address = null ;
foreach ( $addresses as $address ) {
if ( $address [ 'default' ]) {
$default_address = $address ;
break ;
}
}
if ( ! $default_address ) {
$default_address = $addresses [ 0 ];
}
return $default_address ;
}
}
private function addNewAddress ( $customer_id ) {
$data = [
'firstname' => 'John' ,
'lastname' => 'Doe' ,
'address_1' => '123 Main St' ,
'city' => 'New York' ,
'postcode' => '10001' ,
'country_id' => 223 ,
'zone_id' => 3655 ,
'default' => 1
];
return $this -> model_account_address -> addAddress ( $customer_id , $data );
}
}
Addresses are customer-specific. The customer_id parameter ensures addresses can only be accessed by their owner.
Validation
Address validation is performed by the API address controllers:
First name: 1-32 characters
Last name: 1-32 characters
Address: 3-128 characters
City: 2-128 characters
Country: Must exist and be active
Zone: Must exist if country has zones
Postcode: 2-10 characters (if required by country)
Next Steps
Orders API Use addresses in orders
Countries API Get country information
Zones API Get zone/state information
Customers API Manage customer data