Monitor Perplexity Responses
curl --request POST \
--url https://api.cloro.dev/v1/monitor/perplexity \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "What are the best laptops for programming?",
"country": "US",
"include": {
"html": false,
"markdown": false,
"rawResponse": false
},
"state": "CA"
}
'import requests
url = "https://api.cloro.dev/v1/monitor/perplexity"
payload = {
"prompt": "What are the best laptops for programming?",
"country": "US",
"include": {
"html": False,
"markdown": False,
"rawResponse": False
},
"state": "CA"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: 'What are the best laptops for programming?',
country: 'US',
include: {html: false, markdown: false, rawResponse: false},
state: 'CA'
})
};
fetch('https://api.cloro.dev/v1/monitor/perplexity', 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.cloro.dev/v1/monitor/perplexity",
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([
'prompt' => 'What are the best laptops for programming?',
'country' => 'US',
'include' => [
'html' => false,
'markdown' => false,
'rawResponse' => false
],
'state' => 'CA'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://api.cloro.dev/v1/monitor/perplexity"
payload := strings.NewReader("{\n \"prompt\": \"What are the best laptops for programming?\",\n \"country\": \"US\",\n \"include\": {\n \"html\": false,\n \"markdown\": false,\n \"rawResponse\": false\n },\n \"state\": \"CA\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.cloro.dev/v1/monitor/perplexity")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"What are the best laptops for programming?\",\n \"country\": \"US\",\n \"include\": {\n \"html\": false,\n \"markdown\": false,\n \"rawResponse\": false\n },\n \"state\": \"CA\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloro.dev/v1/monitor/perplexity")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"What are the best laptops for programming?\",\n \"country\": \"US\",\n \"include\": {\n \"html\": false,\n \"markdown\": false,\n \"rawResponse\": false\n },\n \"state\": \"CA\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"result": {
"text": "Based on current sources and information, here are the best laptops for programming...",
"html": "https://storage.cloro.dev/results/c45a5081-808d-4ed3-9c86-e4baf16c8ab8/page-1.html",
"sources": [
{
"position": 1,
"url": "https://techcrunch.com/laptops",
"label": "TechCrunch",
"description": "Latest laptop reviews and recommendations"
},
{
"position": 2,
"url": "https://www.youtube.com/watch?v=example",
"label": "Best Laptops 2026",
"description": "Video review of programming laptops"
},
{
"position": 3,
"url": "https://wired.com/programming-laptops",
"label": "Wired",
"description": "Programming laptop buyer's guide"
}
],
"citationPills": [
{
"label": "Best Programming Laptops 2026 — TechCrunch",
"citationPillId": 1,
"url": "https://techcrunch.com/laptops",
"domain": "techcrunch.com",
"description": "Latest laptop reviews and recommendations",
"position": 1
},
{
"label": "Wired Laptop Buyer's Guide",
"citationPillId": 1,
"url": "https://wired.com/programming-laptops",
"domain": "wired.com",
"description": "Programming laptop buyer's guide",
"position": 3
}
],
"markdown": "Based on current sources and information, here are the best laptops for programming...",
"related_queries": [
"best neighborhoods to stay in Lisbon",
"top-rated luxury hotels in Lisbon under €300",
"highest-rated traditional Portuguese restaurants in Baixa"
],
"videos": [
{
"title": "Best hotels in Lisbon, reviewed | The Independent",
"url": "https://www.independent.co.uk/travel/europe/portugal/lisbon/best-lisbon-portugal-hotels-b1987832.html",
"thumbnail": "https://d2u1z1lopyfwlx.cloudfront.net/thumbnails/636fbd12-6dee-5f44-a76d-fe7f9cd20e40/75ce41cb-6767-5082-a330-ee97c5866886.jpg",
"medium": "image",
"source": "web",
"image_width": 5600,
"image_height": 3733,
"thumbnail_width": 300,
"thumbnail_height": 200
}
],
"images": [
{
"title": "Best hotels in Lisbon, reviewed | The Independent",
"url": "https://www.independent.co.uk/travel/europe/portugal/lisbon/best-lisbon-portugal-hotels-b1987832.html",
"thumbnail": "https://d2u1z1lopyfwlx.cloudfront.net/thumbnails/636fbd12-6dee-5f44-a76d-fe7f9cd20e40/75ce41cb-6767-5082-a330-ee97c5866886.jpg",
"medium": "image",
"source": "web",
"image_width": 5600,
"image_height": 3733,
"thumbnail_width": 300,
"thumbnail_height": 200
}
],
"hotels": [
{
"name": "Corpo Santo Lisbon Historical Hotel",
"url": "https://www.tripadvisor.com/Hotel_Review-g189158-d12659702-Reviews-Corpo_Santo_Lisbon_Historical_Hotel-Lisbon_District_Central_Portugal.html",
"rating": 4.9,
"num_reviews": 4374,
"address": [
"Largo do Corpo Santo, 25, Lisbon 1200-129 Portugal"
],
"phone": "+351 21 828 8000",
"description": "Located next to the riverside area, in one of the prime areas of the Lisbon Center...",
"image_url": "https://media-cdn.tripadvisor.com/media/photo-o/30/28/6c/86/caption.jpg",
"images": [
"<string>"
],
"lat": 38.707397,
"lng": -9.142318,
"price_level": "<string>",
"categories": [
"Hotel"
]
}
],
"places": [
{
"name": "Floresta Das Escadinhas",
"url": "https://www.tripadvisor.com/Restaurant_Review-g189158-d1520116-Reviews-Floresta_Das_Escadinhas-Lisbon_District_Central_Portugal.html",
"rating": 4.8,
"address": [
"Rua de Santa Justa N°3, Lisbon 1100-483 Portugal"
],
"lat": 38.712717,
"lng": -9.136362,
"categories": [
"Healthy",
"Grill",
"Barbecue",
"Mediterranean",
"Portuguese",
"European"
],
"map_url": "https://google.com/maps/?q=find+best+hotels+and+restaurants+in+lisbon&ll=38.720914,-9.147162&z=15",
"images": [
"<string>"
]
}
],
"shopping_cards": [
{
"tags": [
"running",
"athletic"
],
"products": [
{
"title": "Nike Pegasus 41",
"id": "nike-pegasus-41",
"url": "https://www.nike.com/t/pegasus-41",
"price": "$140.00",
"merchant": "Nike",
"available": true,
"imageUrls": [
"<string>"
],
"numReviews": 1284,
"offers": [
{
"url": "<string>",
"price": "$140.00",
"merchant_name": "Nike",
"product_name": "Nike Pegasus 41 Running Shoes",
"available": true,
"price_details": {
"display_price": "$140.00"
},
"original_price": null
}
],
"position": 1,
"rating": 4.6,
"original_price": "<string>",
"description": "Responsive cushioning for daily training runs.",
"variants": [
{}
]
}
]
}
],
"search_model_queries": [
{
"query": "find best hotels and restaurants in lisbon",
"engine": "web",
"limit": 8
}
],
"rawResponse": [
"<unknown>"
]
}
}{
"success": false,
"error": "Request validation failed",
"details": [
{
"field": "prompt",
"message": "Prompt cannot be empty"
}
]
}{
"error": {
"code": "MISSING_API_KEY",
"message": "Missing or invalid API key",
"timestamp": "2025-01-15T12:00:00.000Z"
}
}{
"error": {
"code": "INSUFFICIENT_PERMISSIONS",
"message": "Insufficient permissions",
"details": {
"requiredScopes": [
"read:monitor",
"write:monitor"
]
},
"timestamp": "2025-01-15T12:00:00.000Z"
}
}{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Route not found",
"details": {
"id": "/v1/invalid-endpoint"
},
"timestamp": "2025-01-15T12:00:00.000Z"
}
}{
"error": {
"code": "RESOURCE_CONFLICT",
"message": "Resource conflict",
"timestamp": "2025-01-15T12:00:00.000Z"
}
}{
"error": {
"code": "CONCURRENT_LIMIT_EXCEEDED",
"message": "Concurrent limit exceeded",
"details": {
"limit": 10
},
"timestamp": "2025-01-15T12:00:00.000Z"
}
}{
"success": false,
"error": "Request was canceled"
}{
"success": false,
"error": "Maximum retries exceeded"
}{
"error": {
"code": "EXTERNAL_SERVICE_ERROR",
"message": "External service error: OpenAI",
"details": {
"service": "OpenAI"
},
"timestamp": "2025-01-15T12:00:00.000Z"
}
}Perplexity
Extract Perplexity
Extract structured data from Perplexity AI about your brand, products, or any topic across various regions
POST
/
v1
/
monitor
/
perplexity
Monitor Perplexity Responses
curl --request POST \
--url https://api.cloro.dev/v1/monitor/perplexity \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "What are the best laptops for programming?",
"country": "US",
"include": {
"html": false,
"markdown": false,
"rawResponse": false
},
"state": "CA"
}
'import requests
url = "https://api.cloro.dev/v1/monitor/perplexity"
payload = {
"prompt": "What are the best laptops for programming?",
"country": "US",
"include": {
"html": False,
"markdown": False,
"rawResponse": False
},
"state": "CA"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: 'What are the best laptops for programming?',
country: 'US',
include: {html: false, markdown: false, rawResponse: false},
state: 'CA'
})
};
fetch('https://api.cloro.dev/v1/monitor/perplexity', 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.cloro.dev/v1/monitor/perplexity",
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([
'prompt' => 'What are the best laptops for programming?',
'country' => 'US',
'include' => [
'html' => false,
'markdown' => false,
'rawResponse' => false
],
'state' => 'CA'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://api.cloro.dev/v1/monitor/perplexity"
payload := strings.NewReader("{\n \"prompt\": \"What are the best laptops for programming?\",\n \"country\": \"US\",\n \"include\": {\n \"html\": false,\n \"markdown\": false,\n \"rawResponse\": false\n },\n \"state\": \"CA\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.cloro.dev/v1/monitor/perplexity")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"What are the best laptops for programming?\",\n \"country\": \"US\",\n \"include\": {\n \"html\": false,\n \"markdown\": false,\n \"rawResponse\": false\n },\n \"state\": \"CA\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloro.dev/v1/monitor/perplexity")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"What are the best laptops for programming?\",\n \"country\": \"US\",\n \"include\": {\n \"html\": false,\n \"markdown\": false,\n \"rawResponse\": false\n },\n \"state\": \"CA\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"result": {
"text": "Based on current sources and information, here are the best laptops for programming...",
"html": "https://storage.cloro.dev/results/c45a5081-808d-4ed3-9c86-e4baf16c8ab8/page-1.html",
"sources": [
{
"position": 1,
"url": "https://techcrunch.com/laptops",
"label": "TechCrunch",
"description": "Latest laptop reviews and recommendations"
},
{
"position": 2,
"url": "https://www.youtube.com/watch?v=example",
"label": "Best Laptops 2026",
"description": "Video review of programming laptops"
},
{
"position": 3,
"url": "https://wired.com/programming-laptops",
"label": "Wired",
"description": "Programming laptop buyer's guide"
}
],
"citationPills": [
{
"label": "Best Programming Laptops 2026 — TechCrunch",
"citationPillId": 1,
"url": "https://techcrunch.com/laptops",
"domain": "techcrunch.com",
"description": "Latest laptop reviews and recommendations",
"position": 1
},
{
"label": "Wired Laptop Buyer's Guide",
"citationPillId": 1,
"url": "https://wired.com/programming-laptops",
"domain": "wired.com",
"description": "Programming laptop buyer's guide",
"position": 3
}
],
"markdown": "Based on current sources and information, here are the best laptops for programming...",
"related_queries": [
"best neighborhoods to stay in Lisbon",
"top-rated luxury hotels in Lisbon under €300",
"highest-rated traditional Portuguese restaurants in Baixa"
],
"videos": [
{
"title": "Best hotels in Lisbon, reviewed | The Independent",
"url": "https://www.independent.co.uk/travel/europe/portugal/lisbon/best-lisbon-portugal-hotels-b1987832.html",
"thumbnail": "https://d2u1z1lopyfwlx.cloudfront.net/thumbnails/636fbd12-6dee-5f44-a76d-fe7f9cd20e40/75ce41cb-6767-5082-a330-ee97c5866886.jpg",
"medium": "image",
"source": "web",
"image_width": 5600,
"image_height": 3733,
"thumbnail_width": 300,
"thumbnail_height": 200
}
],
"images": [
{
"title": "Best hotels in Lisbon, reviewed | The Independent",
"url": "https://www.independent.co.uk/travel/europe/portugal/lisbon/best-lisbon-portugal-hotels-b1987832.html",
"thumbnail": "https://d2u1z1lopyfwlx.cloudfront.net/thumbnails/636fbd12-6dee-5f44-a76d-fe7f9cd20e40/75ce41cb-6767-5082-a330-ee97c5866886.jpg",
"medium": "image",
"source": "web",
"image_width": 5600,
"image_height": 3733,
"thumbnail_width": 300,
"thumbnail_height": 200
}
],
"hotels": [
{
"name": "Corpo Santo Lisbon Historical Hotel",
"url": "https://www.tripadvisor.com/Hotel_Review-g189158-d12659702-Reviews-Corpo_Santo_Lisbon_Historical_Hotel-Lisbon_District_Central_Portugal.html",
"rating": 4.9,
"num_reviews": 4374,
"address": [
"Largo do Corpo Santo, 25, Lisbon 1200-129 Portugal"
],
"phone": "+351 21 828 8000",
"description": "Located next to the riverside area, in one of the prime areas of the Lisbon Center...",
"image_url": "https://media-cdn.tripadvisor.com/media/photo-o/30/28/6c/86/caption.jpg",
"images": [
"<string>"
],
"lat": 38.707397,
"lng": -9.142318,
"price_level": "<string>",
"categories": [
"Hotel"
]
}
],
"places": [
{
"name": "Floresta Das Escadinhas",
"url": "https://www.tripadvisor.com/Restaurant_Review-g189158-d1520116-Reviews-Floresta_Das_Escadinhas-Lisbon_District_Central_Portugal.html",
"rating": 4.8,
"address": [
"Rua de Santa Justa N°3, Lisbon 1100-483 Portugal"
],
"lat": 38.712717,
"lng": -9.136362,
"categories": [
"Healthy",
"Grill",
"Barbecue",
"Mediterranean",
"Portuguese",
"European"
],
"map_url": "https://google.com/maps/?q=find+best+hotels+and+restaurants+in+lisbon&ll=38.720914,-9.147162&z=15",
"images": [
"<string>"
]
}
],
"shopping_cards": [
{
"tags": [
"running",
"athletic"
],
"products": [
{
"title": "Nike Pegasus 41",
"id": "nike-pegasus-41",
"url": "https://www.nike.com/t/pegasus-41",
"price": "$140.00",
"merchant": "Nike",
"available": true,
"imageUrls": [
"<string>"
],
"numReviews": 1284,
"offers": [
{
"url": "<string>",
"price": "$140.00",
"merchant_name": "Nike",
"product_name": "Nike Pegasus 41 Running Shoes",
"available": true,
"price_details": {
"display_price": "$140.00"
},
"original_price": null
}
],
"position": 1,
"rating": 4.6,
"original_price": "<string>",
"description": "Responsive cushioning for daily training runs.",
"variants": [
{}
]
}
]
}
],
"search_model_queries": [
{
"query": "find best hotels and restaurants in lisbon",
"engine": "web",
"limit": 8
}
],
"rawResponse": [
"<unknown>"
]
}
}{
"success": false,
"error": "Request validation failed",
"details": [
{
"field": "prompt",
"message": "Prompt cannot be empty"
}
]
}{
"error": {
"code": "MISSING_API_KEY",
"message": "Missing or invalid API key",
"timestamp": "2025-01-15T12:00:00.000Z"
}
}{
"error": {
"code": "INSUFFICIENT_PERMISSIONS",
"message": "Insufficient permissions",
"details": {
"requiredScopes": [
"read:monitor",
"write:monitor"
]
},
"timestamp": "2025-01-15T12:00:00.000Z"
}
}{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Route not found",
"details": {
"id": "/v1/invalid-endpoint"
},
"timestamp": "2025-01-15T12:00:00.000Z"
}
}{
"error": {
"code": "RESOURCE_CONFLICT",
"message": "Resource conflict",
"timestamp": "2025-01-15T12:00:00.000Z"
}
}{
"error": {
"code": "CONCURRENT_LIMIT_EXCEEDED",
"message": "Concurrent limit exceeded",
"details": {
"limit": 10
},
"timestamp": "2025-01-15T12:00:00.000Z"
}
}{
"success": false,
"error": "Request was canceled"
}{
"success": false,
"error": "Maximum retries exceeded"
}{
"error": {
"code": "EXTERNAL_SERVICE_ERROR",
"message": "External service error: OpenAI",
"details": {
"service": "OpenAI"
},
"timestamp": "2025-01-15T12:00:00.000Z"
}
}Overview
The Perplexity endpoint extracts structured data from Perplexity AI with real-time web sources. Beyond basic text responses, it automatically detects and extracts data objects including shopping products, media content, travel information, and location data based on query intent.Web search enabledThis endpoint uses Perplexity’s default interface, which always performs web searches for all requests to provide real-time information with source citations.
- Shopping queries: Product information, pricing, and shopping cards
- Travel queries: Hotel listings and places
- Media queries: Videos and images related to the search
- General queries: Standard web search with sources and citations
Request parameters
Uses common parameters. Endpoint-specific options:include.rawResponse(boolean): Include raw streaming response events. Defaults tofalse
Response objects
The response includes the following sections. See each subpage for the full schema and examples.| Section | Description |
|---|---|
| Sources | Source citations referenced in the response |
| Shopping cards | Product cards with pricing, ratings, and offers |
| Media | Videos and images relevant to the query |
| Travel and places | Hotels and places when travel intent is detected |
Response schema
Includes common response fields plus:Core response fields
| Field | Type | Description |
|---|---|---|
result.text | string | Perplexity’s response text |
result.html | string | Response formatted in HTML (included when include.html is true) |
result.sources | array | Array of sources referenced in the response |
result.markdown | string | Response formatted in Markdown (included when include.markdown is true) |
result.rawResponse | array | Array of Perplexity’s streamed response events (included when include.rawResponse is true) |
result.shopping_cards | array | Shopping cards when shopping intent detected |
result.videos | array | Videos relevant to the query |
result.images | array | Images relevant to the query |
result.hotels | array | Hotels when travel intent detected |
result.places | array | Places when location intent detected |
Additional response data
| Field | Type | Description |
|---|---|---|
result.related_queries | array | Suggested follow-up search queries |
result.search_model_queries | array | Internal search queries (fan-outs) used to generate response |
| Field | Type | Description |
|---|---|---|
query | string | Actual search query used |
engine | string | Search engine type (“web”, etc.) |
limit | number | Result limit (typically 8) |
Common questions
I’m getting 500 errors on certain prompts. What’s happening?
Perplexity occasionally classifies certain queries as “personal search” (queries with location context, first-person phrasing, or user-specific intent) and returns a 500 error. Mitigations:- Remove in-prompt location injections — use the
countryrequest parameter instead of writing location into the prompt. - Append
"This is not a personal search."to affected prompts (reduces but does not eliminate failures; may slightly affect response quality). - Build retry logic: Perplexity already retries internally 5–10 times, so persistent 500s after retries indicate a genuine personal-search classification.
How common are Perplexity shopping cards?
result.shopping_cards appear in fewer than 1 in 1,000 Perplexity responses (approximately 0.1% as of May 2026, compared to ~3.5% for ChatGPT and ~11% for Copilot). Do not build a workflow that depends on Perplexity returning shopping data.
I see [cite ] text in the response. Is that a bug?
No. Approximately 1% of Perplexity responses contain [cite ] placeholder text in result.text and result.markdown. This is an upstream Perplexity behavior — the platform occasionally emits a citation marker that doesn’t resolve to a URL. Strip or ignore [cite ] tokens in your post-processing.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Request parameters for monitoring Perplexity responses
The prompt to send to Perplexity
Required string length:
1 - 10000Example:
"What are the best laptops for programming?"
Country/region code for localized response
Example:
"US"
Optional flags for including additional response formats
Show child attributes
Show child attributes
State code for sub-country geo-targeting (e.g., "CA"). Only valid with country "US".
Required string length:
2Pattern:
^[A-Z]{2}$Example:
"CA"
Was this page helpful?
⌘I