> This page is for Developer.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.bigcommerce.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.bigcommerce.com/_mcp/server.

# Create Customer Attribute

POST https://api.bigcommerce.com/stores/{store_hash}/v3/customers/attributes
Content-Type: application/json

Creates a Customer Attribute. Multiple customer attributes can be created in one call.

**Required Fields**
* name
* type

**Limits**
* Limit of 3 concurrent requests.

**Notes**

Once the data type is set, it cannot be changed. The attribute will need to be deleted then created again with the new data type. This will also delete it from the customer.

Customer attributes are created separately from the customer. After the name and type are created, then the attributes can be added to the customer.

A store cannot have more than 50 customer attributes.

Reference: https://docs.bigcommerce.com/developer/api-reference/rest/admin/management/customers/v3/attributes/create-customers-attributes

## Authentication

- `X-Auth-Token` header (required) — ### OAuth scopes | UI Name | Permission | Parameter | |:--------|:-----------|:----------| | Customers | modify | `store_v2_customers` | | Customers | read-only | `store_v2_customers_read_only` | | Stored Payment Instruments | modify | `store_stored_payment_instruments` | | Stored Payment Instruments | read-only | `store_stored_payment_instruments_read_only` | ### Authentication header | Header | Argument | Description | |:-------|:---------|:------------| | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see our [Guide to API Accounts](/developer/docs/overview/api-fundamentals/api-accounts#api-accounts). | ### Further reading For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/developer/docs/overview/api-fundamentals/api-accounts#x-auth-token-header-example-requests). For more about BigCommerce OAuth scopes, see our [Guide to API Accounts](/developer/docs/overview/api-fundamentals/api-accounts#oauth-scopes). For a list of API status codes, see [API Status Codes](/developer/api-reference/rest/overview#rest-http-status-codes).

## Request

### Path parameters

- `store_hash` (string, required) — Permanent ID of the BigCommerce store.

### Headers

- `Accept` (string, optional, default: application/json) — The MIME type of the response body that the client accepts. Typically `application/json`.

### Body (application/json)

This endpoint expects a list of attribute_Post.

- `list of attribute_Post`

## Response

### 200

A list of customer attributes.

- `data` (list of CustomersAttributesPostResponsesContentApplicationJsonSchemaDataItems, optional)
- `meta` (MetaOpen, optional) — Response metadata.

## Errors

### 422 Unprocessable Entity Error

The `Attribute` was not valid. This is the result of missing required fields, or of invalid data. See the response for more details.

- `status` (integer, optional) — The HTTP status code.
- `title` (string, optional) — The error title describing the particular error.
- `type` (string, optional) — A link to a list of BigCommerce API status codes.
- `instance` (string, optional)
- `errors` (ErrorResponseErrors, optional)

## Types

### attribute_Post

- `name` (string, required) — Attribute name.
- `type` (enum, required) — Attribute type should match one of: string, number, date.
  - Allowed values: `string`, `number`, `date`

### CustomersAttributesPostResponsesContentApplicationJsonSchemaDataItems

- `name` (string, required) — Attribute name.
- `type` (enum, required) — Attribute type should match one of: string, number, date.
  - Allowed values: `string`, `number`, `date`
- `id` (integer, required) — Attribute ID.
- `date_modified` (datetime, optional) — The date on which the customer attribute was modified.
- `date_created` (datetime, optional) — The date of which the customer attribute was created.

### MetaOpen

Response metadata.

### ErrorResponseErrors

## Examples

**Request**

```json
[
  {
    "name": "string",
    "type": "string"
  }
]
```

**Response**

```json
{
  "data": [
    {
      "name": "Age",
      "type": "string",
      "id": 1,
      "date_modified": "2018-11-14T16:46:23Z",
      "date_created": "2018-11-13T21:42:06Z"
    }
  ],
  "meta": {}
}
```

**SDK Code**

```python response
import requests

url = "https://api.bigcommerce.com/stores/store_hash/v3/customers/attributes"

payload = [
    {
        "name": "string",
        "type": "string"
    }
]
headers = {
    "X-Auth-Token": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript response
const url = 'https://api.bigcommerce.com/stores/store_hash/v3/customers/attributes';
const options = {
  method: 'POST',
  headers: {'X-Auth-Token': '<apiKey>', 'Content-Type': 'application/json'},
  body: '[{"name":"string","type":"string"}]'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go response
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.bigcommerce.com/stores/store_hash/v3/customers/attributes"

	payload := strings.NewReader("[\n  {\n    \"name\": \"string\",\n    \"type\": \"string\"\n  }\n]")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("X-Auth-Token", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby response
require 'uri'
require 'net/http'

url = URI("https://api.bigcommerce.com/stores/store_hash/v3/customers/attributes")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["X-Auth-Token"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "[\n  {\n    \"name\": \"string\",\n    \"type\": \"string\"\n  }\n]"

response = http.request(request)
puts response.read_body
```

```java response
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.bigcommerce.com/stores/store_hash/v3/customers/attributes")
  .header("X-Auth-Token", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("[\n  {\n    \"name\": \"string\",\n    \"type\": \"string\"\n  }\n]")
  .asString();
```

```php response
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.bigcommerce.com/stores/store_hash/v3/customers/attributes', [
  'body' => '[
  {
    "name": "string",
    "type": "string"
  }
]',
  'headers' => [
    'Content-Type' => 'application/json',
    'X-Auth-Token' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp response
using RestSharp;

var client = new RestClient("https://api.bigcommerce.com/stores/store_hash/v3/customers/attributes");
var request = new RestRequest(Method.POST);
request.AddHeader("X-Auth-Token", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "[\n  {\n    \"name\": \"string\",\n    \"type\": \"string\"\n  }\n]", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift response
import Foundation

let headers = [
  "X-Auth-Token": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  [
    "name": "string",
    "type": "string"
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.bigcommerce.com/stores/store_hash/v3/customers/attributes")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```