> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.beehiiv.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.beehiiv.com/_mcp/server.
# List publication field values OAuth Scope: publication_fields:read
GET https://api.beehiiv.com/v2/workspaces/publication_field_values
This feature is currently in beta and the API is subject to change.
Retrieve the values a publication field resolves to. Provide exactly one of `publication_id`, for each field of a single publication, or `publication_field_id`, for a single field across every publication in the workspace. Values are reported as they stand. Fetched fields are not retrieved as part of this request; use `fetched_at` to judge how current a value is. Requires an API key with access to every publication in the workspace.
Reference: https://developers.beehiiv.com/api-reference/publication-fields/values-index
## Authentication
- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer `, where token is your auth token.
## Request
### Query parameters
- `publication_id` (string, optional) — Return one result per field for this publication. Cannot be combined with `publication_field_id`.
- `publication_field_id` (string, optional) — Return one result per publication for this field. Cannot be combined with `publication_id`. Archived fields are accepted, since their values still resolve in content.
- `status` (enum, optional) — Filter the fields returned for a publication by whether they have been archived. Only applies alongside `publication_id`, and defaults to `active`.
- Allowed values: `active`, `archived`, `all`
- `limit` (integer, optional) — A limit on the number of objects to be returned. The limit can range between 1 and 100, and the default is 10.
- `cursor` (string, optional) — **Cursor-based pagination (recommended)**: Use this opaque cursor token to fetch the next page of results. When provided, pagination will use cursor-based method which is more efficient and consistent than offset-based pagination.
- `page` (integer, optional) — **Offset-based pagination (deprecated)**: Page number for offset-based pagination. Please migrate to cursor-based pagination using the `cursor` parameter. If not specified, results 1-10 from page 1 will be returned.
## Response
### 200
OK
- `data` (list of PublicationFieldValue, required) — An array of publication field values.
- `limit` (integer, optional) — The limit placed on the results. If no limit was specified in the request, this defaults to 10.
- `has_more` (boolean, optional) — **Cursor pagination only**: Indicates whether there are more results available after the current page. Only present when using cursor-based pagination.
- `next_cursor` (string, optional) — **Cursor pagination only**: The cursor token to use for fetching the next page of results. This will be null if has_more is false. Only present when using cursor-based pagination.
- `page` (integer, optional) — **Offset pagination only**: The page of results returned. Only present when using the deprecated `page` parameter.
- `total_results` (integer, optional) — The total number of results from all pages.
- `total_pages` (integer, optional) — **Offset pagination only**: The total number of pages. Only present when using the deprecated `page` parameter.
## Errors
### 400 Bad Request Error
Bad Request
- `status` (integer, required)
- `statusText` (string, required)
- `errors` (list of ErrorDetail, required)
### 401 Unauthorized Error
Unauthorized. The API key or OAuth access token is missing, invalid, or expired.
- `status` (integer, required)
- `statusText` (string, required)
- `errors` (list of ErrorDetail, required)
### 403 Forbidden Error
Forbidden
- `status` (integer, required)
- `statusText` (string, required)
- `errors` (list of ErrorDetail, required)
### 404 Not Found Error
Resource Not Found
- `status` (integer, required)
- `statusText` (string, required)
- `errors` (list of ErrorDetail, required)
### 429 Too Many Requests Error
Rate Limit Exceeded
- `status` (integer, required)
- `statusText` (string, required)
- `errors` (list of ErrorDetail, required)
### 500 Internal Server Error
Internal Server Error
- `status` (integer, required)
- `statusText` (string, required)
- `errors` (list of ErrorDetail, required)
## Types
### PublicationFieldValue
- `publication_field_id` (string, required) — The prefixed ID of the publication field.
- `publication_field_name` (string, required) — The name of the publication field, which is the key it is referenced by in content.
- `publication_id` (string, required) — The prefixed ID of the publication.
- `publication_name` (string, required) — The name of the publication.
- `status` (enum, required) — How the value resolves.
- Allowed values: `set`, `using_default`, `no_value`, `fetched_ok`, `fetch_failed_stale`, `fetch_failed`, `never_fetched`
- `value` (string, optional) — The value the publication resolves to, falling back to the field's default value. An empty string when neither is set. Null for `json` fields, which hold a whole response body rather than a single value.
- `fetched_at` (integer, optional) — The time the value was last retrieved successfully, measured in seconds since the Unix epoch. Null for fields that are not fetched, and for fetched fields that have never been retrieved successfully.
- `key_values` (list of PublicationFieldKeyValue, optional) — The `json` field's declared keys and the values from the last successful fetch, in declaration order. Null for fields that are not `json`.
### ErrorDetail
- `message` (string, required)
- `code` (string, required)
### PublicationFieldKeyValue
- `key` (string, required) — A key declared by the publication field.
- `value` (string, optional) — The fetched value rendered as a string. Null when the key was omitted, held an object or array, did not match the declared kind, or was too large to render.
## Examples
### By publication
**Response**
```json
{
"data": [
{
"publication_field_id": "pub_field_00000000-0000-0000-0000-000000000000",
"publication_field_name": "support_email",
"publication_id": "pub_00000000-0000-0000-0000-000000000000",
"publication_name": "Morning Brew",
"status": "set",
"value": "help@morningbrew.com",
"fetched_at": null
},
{
"publication_field_id": "pub_field_11111111-1111-1111-1111-111111111111",
"publication_field_name": "weather",
"publication_id": "pub_00000000-0000-0000-0000-000000000000",
"publication_name": "Morning Brew",
"status": "fetched_ok",
"value": null,
"fetched_at": 1700000000,
"key_values": [
{
"key": "condition",
"value": "Cloudy"
},
{
"key": "temp",
"value": "71"
}
]
}
],
"limit": 10,
"has_more": false,
"next_cursor": null
}
```
**SDK Code**
```python By publication
import requests
url = "https://api.beehiiv.com/v2/workspaces/publication_field_values"
querystring = {"publication_id":"pub_00000000-0000-0000-0000-000000000000","limit":"10"}
headers = {"Authorization": "Bearer "}
response = requests.get(url, headers=headers, params=querystring)
print(response.json())
```
```javascript By publication
const url = 'https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_id=pub_00000000-0000-0000-0000-000000000000&limit=10';
const options = {method: 'GET', headers: {Authorization: 'Bearer '}};
try {
const response = await fetch(url, options);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
```
```go By publication
package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_id=pub_00000000-0000-0000-0000-000000000000&limit=10"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer ")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}
```
```ruby By publication
require 'uri'
require 'net/http'
url = URI("https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_id=pub_00000000-0000-0000-0000-000000000000&limit=10")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer '
response = http.request(request)
puts response.read_body
```
```java By publication
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
HttpResponse response = Unirest.get("https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_id=pub_00000000-0000-0000-0000-000000000000&limit=10")
.header("Authorization", "Bearer ")
.asString();
```
```php By publication
request('GET', 'https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_id=pub_00000000-0000-0000-0000-000000000000&limit=10', [
'headers' => [
'Authorization' => 'Bearer ',
],
]);
echo $response->getBody();
```
```csharp By publication
using RestSharp;
var client = new RestClient("https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_id=pub_00000000-0000-0000-0000-000000000000&limit=10");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer ");
IRestResponse response = client.Execute(request);
```
```swift By publication
import Foundation
let headers = ["Authorization": "Bearer "]
let request = NSMutableURLRequest(url: NSURL(string: "https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_id=pub_00000000-0000-0000-0000-000000000000&limit=10")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers
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()
```
### By field
**Response**
```json
{
"data": [
{
"publication_field_id": "pub_field_00000000-0000-0000-0000-000000000000",
"publication_field_name": "support_email",
"publication_id": "pub_00000000-0000-0000-0000-000000000000",
"publication_name": "Morning Brew",
"status": "set",
"value": "help@morningbrew.com",
"fetched_at": null
},
{
"publication_field_id": "pub_field_00000000-0000-0000-0000-000000000000",
"publication_field_name": "support_email",
"publication_id": "pub_22222222-2222-2222-2222-222222222222",
"publication_name": "Marketing Brew",
"status": "using_default",
"value": "support@beehiiv.com",
"fetched_at": null
}
],
"limit": 10,
"has_more": false,
"next_cursor": null
}
```
**SDK Code**
```python By field
import requests
url = "https://api.beehiiv.com/v2/workspaces/publication_field_values"
querystring = {"publication_field_id":"pub_field_00000000-0000-0000-0000-000000000000","limit":"10"}
headers = {"Authorization": "Bearer "}
response = requests.get(url, headers=headers, params=querystring)
print(response.json())
```
```javascript By field
const url = 'https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_field_id=pub_field_00000000-0000-0000-0000-000000000000&limit=10';
const options = {method: 'GET', headers: {Authorization: 'Bearer '}};
try {
const response = await fetch(url, options);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
```
```go By field
package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_field_id=pub_field_00000000-0000-0000-0000-000000000000&limit=10"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer ")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}
```
```ruby By field
require 'uri'
require 'net/http'
url = URI("https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_field_id=pub_field_00000000-0000-0000-0000-000000000000&limit=10")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer '
response = http.request(request)
puts response.read_body
```
```java By field
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
HttpResponse response = Unirest.get("https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_field_id=pub_field_00000000-0000-0000-0000-000000000000&limit=10")
.header("Authorization", "Bearer ")
.asString();
```
```php By field
request('GET', 'https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_field_id=pub_field_00000000-0000-0000-0000-000000000000&limit=10', [
'headers' => [
'Authorization' => 'Bearer ',
],
]);
echo $response->getBody();
```
```csharp By field
using RestSharp;
var client = new RestClient("https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_field_id=pub_field_00000000-0000-0000-0000-000000000000&limit=10");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer ");
IRestResponse response = client.Execute(request);
```
```swift By field
import Foundation
let headers = ["Authorization": "Bearer "]
let request = NSMutableURLRequest(url: NSURL(string: "https://api.beehiiv.com/v2/workspaces/publication_field_values?publication_field_id=pub_field_00000000-0000-0000-0000-000000000000&limit=10")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers
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()
```
> Build your audience with beehiiv's API and SDKs. Create new subscribers and posts, get real-time notifications of subscription activity, and more.