Buy storage
curl --request POST \
--url https://api.neynar.com/v2/farcaster/storage/buy/ \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-wallet-id: <x-wallet-id>' \
--data '
{
"fid": 1,
"idem": "<string>",
"units": 1
}
'import requests
url = "https://api.neynar.com/v2/farcaster/storage/buy/"
payload = {
"fid": 1,
"idem": "<string>",
"units": 1
}
headers = {
"x-wallet-id": "<x-wallet-id>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-wallet-id': '<x-wallet-id>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({fid: 1, idem: '<string>', units: 1})
};
fetch('https://api.neynar.com/v2/farcaster/storage/buy/', 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.neynar.com/v2/farcaster/storage/buy/",
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([
'fid' => 1,
'idem' => '<string>',
'units' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>",
"x-wallet-id: <x-wallet-id>"
],
]);
$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.neynar.com/v2/farcaster/storage/buy/"
payload := strings.NewReader("{\n \"fid\": 1,\n \"idem\": \"<string>\",\n \"units\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-wallet-id", "<x-wallet-id>")
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.post("https://api.neynar.com/v2/farcaster/storage/buy/")
.header("x-wallet-id", "<x-wallet-id>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"fid\": 1,\n \"idem\": \"<string>\",\n \"units\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.neynar.com/v2/farcaster/storage/buy/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-wallet-id"] = '<x-wallet-id>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fid\": 1,\n \"idem\": \"<string>\",\n \"units\": 1\n}"
response = http.request(request)
puts response.read_body{
"allocations": [
{
"expiry": "2024-10-08T22:03:49.000Z",
"object": "storage_allocation",
"timestamp": "2023-10-09T22:03:49.000Z",
"units": 10,
"user": {
"fid": 3,
"object": "user_dehydrated",
"custody_address": "0x5a927ac639636e534b678e81768ca19e2c6280b7",
"display_name": "<string>",
"pfp_url": "<string>",
"score": 123,
"username": "<string>"
}
}
],
"total_active_units": 13
}{
"code": "InvalidField",
"errors": [
{
"code": "<string>",
"expected": "<string>",
"message": "<string>",
"path": [
"<string>"
],
"received": "<string>"
}
],
"message": "Invalid query parameters"
}{
"message": "<string>",
"code": "<string>",
"key": "<string>",
"property": "<string>"
}{
"message": "<string>",
"code": "<string>",
"property": "<string>",
"status": 123
}Storage
Buy storage
This api will help you rent units of storage for an year for a specific FID. A storage unit lets you store 5000 casts, 2500 reactions and 2500 links. Requires x-wallet-id header.
POST
/
v2
/
farcaster
/
storage
/
buy
/
Buy storage
curl --request POST \
--url https://api.neynar.com/v2/farcaster/storage/buy/ \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-wallet-id: <x-wallet-id>' \
--data '
{
"fid": 1,
"idem": "<string>",
"units": 1
}
'import requests
url = "https://api.neynar.com/v2/farcaster/storage/buy/"
payload = {
"fid": 1,
"idem": "<string>",
"units": 1
}
headers = {
"x-wallet-id": "<x-wallet-id>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-wallet-id': '<x-wallet-id>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({fid: 1, idem: '<string>', units: 1})
};
fetch('https://api.neynar.com/v2/farcaster/storage/buy/', 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.neynar.com/v2/farcaster/storage/buy/",
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([
'fid' => 1,
'idem' => '<string>',
'units' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>",
"x-wallet-id: <x-wallet-id>"
],
]);
$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.neynar.com/v2/farcaster/storage/buy/"
payload := strings.NewReader("{\n \"fid\": 1,\n \"idem\": \"<string>\",\n \"units\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-wallet-id", "<x-wallet-id>")
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.post("https://api.neynar.com/v2/farcaster/storage/buy/")
.header("x-wallet-id", "<x-wallet-id>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"fid\": 1,\n \"idem\": \"<string>\",\n \"units\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.neynar.com/v2/farcaster/storage/buy/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-wallet-id"] = '<x-wallet-id>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fid\": 1,\n \"idem\": \"<string>\",\n \"units\": 1\n}"
response = http.request(request)
puts response.read_body{
"allocations": [
{
"expiry": "2024-10-08T22:03:49.000Z",
"object": "storage_allocation",
"timestamp": "2023-10-09T22:03:49.000Z",
"units": 10,
"user": {
"fid": 3,
"object": "user_dehydrated",
"custody_address": "0x5a927ac639636e534b678e81768ca19e2c6280b7",
"display_name": "<string>",
"pfp_url": "<string>",
"score": 123,
"username": "<string>"
}
}
],
"total_active_units": 13
}{
"code": "InvalidField",
"errors": [
{
"code": "<string>",
"expected": "<string>",
"message": "<string>",
"path": [
"<string>"
],
"received": "<string>"
}
],
"message": "Invalid query parameters"
}{
"message": "<string>",
"code": "<string>",
"key": "<string>",
"property": "<string>"
}{
"message": "<string>",
"code": "<string>",
"property": "<string>",
"status": 123
}Node.js SDK
π SDK Method: buyStorage Use this API endpoint with the Neynar Node.js SDK for typed responses and better developer experience.Related documentation:
- Managing Onchain Wallets - Wallet setup guide
- Storage documentation - Understanding storage
Understanding Wallet ID for Storage Purchases
This endpoint allows you to purchase storage units for a specific FID (Farcaster ID). Storage units enable users to store more casts, reactions, and links on the Farcaster protocol.Wallet ID (REQUIRED)
Thex-wallet-id header is required for this endpoint. You must provide a wallet_id to pay for the onchain storage purchase transaction.
New to Wallet IDs? See Managing Onchain Wallets to create your app wallet in the developer portal and obtain your
x-wallet-id value.Code Examples
const response = await fetch('https://api.neynar.com/v2/farcaster/storage/buy', {
method: 'POST',
headers: {
'x-api-key': 'YOUR_NEYNAR_API_KEY',
'x-wallet-id': 'your-wallet-id', // REQUIRED
'Content-Type': 'application/json'
},
body: JSON.stringify({
fid: 12345,
units: 1
})
});
const data = await response.json();
console.log('Storage purchased:', data);
curl -X POST 'https://api.neynar.com/v2/farcaster/storage/buy' \
-H 'x-api-key: YOUR_NEYNAR_API_KEY' \
-H 'x-wallet-id: your-wallet-id' \
-H 'Content-Type: application/json' \
-d '{
"fid": 12345,
"units": 1
}'
import requests
headers = {
'x-api-key': 'YOUR_NEYNAR_API_KEY',
'x-wallet-id': 'your-wallet-id', # REQUIRED
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.neynar.com/v2/farcaster/storage/buy',
headers=headers,
json={
'fid': 12345,
'units': 1
}
)
data = response.json()
print('Storage purchased:', data)
What Youβre Paying For
When you buy storage with a wallet_id:- Transaction Execution: Neynar handles gas estimation, retries, and monitoring
Storage Units Explained
Each storage unit you purchase provides:| Resource | Capacity per Unit |
|---|---|
| Casts | 5,000 casts |
| Reactions | 2,500 reactions |
| Links | 2,500 links (follows, etc.) |
- Duration: 1 year from purchase
- Network: Optimism mainnet
- Renewal: Must be renewed annually
Planning storage needs? Most active users need 1-2 units per year. Power users (>50 casts/day) may need 3-5 units.
Error Handling
Error: Missing Wallet ID
{
"code": "RequiredField",
"message": "x-wallet-id header is required"
}
x-wallet-id header. See Managing Onchain Wallets for setup instructions.
Error: Invalid Wallet ID
{
"code": "InvalidWalletId",
"message": "The provided wallet_id is invalid or not found."
}
Error: Insufficient Wallet Balance
{
"code": "InsufficientFunds",
"message": "Wallet does not have enough balance to complete this transaction."
}
Next Steps
Check Current Storage
View storage allocations for a user
Monitor Usage
Track storage consumption
Manage Your Wallet
Fund your wallet and monitor balance
Contact Support
Need help? Reach out to our team
Authorizations
API key to authorize requests
Headers
Wallet ID to use for transactions
Body
application/json
The unique identifier of a farcaster user or app (unsigned integer)
Required range:
x >= 1Example:
1
An Idempotency key is a unique identifier for the request. Note:
- This is used to prevent duplicate requests. Use the same idem key on retry attempts.
- This should be a unique identifier for each request.
- Recommended format is a 16-character string generated by the developer at the time of making this request.
Number of storage units to buy. A storage unit lets you store 5000 casts, 2500 reactions and 2500 links.
Required range:
x >= 1Example:
1
Related topics
buyStorageSDK v1 to v2 migration guideManaging Onchain WalletsStorage Units AllocationWhitepaperWas this page helpful?