curl --request PATCH \
--url https://api.juicer.io/v1/feeds/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"sync_interval": 123,
"queue": true,
"allowed": "<string>",
"disallowed": "<string>",
"profanity": true,
"prevent_duplicates": true,
"ai_moderation": true,
"ai_harmful_content_filter": true,
"ai_moderation_rules": "<string>",
"ai_sentiment_filter": []
}
'import requests
url = "https://api.juicer.io/v1/feeds/{id}"
payload = {
"name": "<string>",
"sync_interval": 123,
"queue": True,
"allowed": "<string>",
"disallowed": "<string>",
"profanity": True,
"prevent_duplicates": True,
"ai_moderation": True,
"ai_harmful_content_filter": True,
"ai_moderation_rules": "<string>",
"ai_sentiment_filter": []
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
sync_interval: 123,
queue: true,
allowed: '<string>',
disallowed: '<string>',
profanity: true,
prevent_duplicates: true,
ai_moderation: true,
ai_harmful_content_filter: true,
ai_moderation_rules: '<string>',
ai_sentiment_filter: []
})
};
fetch('https://api.juicer.io/v1/feeds/{id}', 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.juicer.io/v1/feeds/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'sync_interval' => 123,
'queue' => true,
'allowed' => '<string>',
'disallowed' => '<string>',
'profanity' => true,
'prevent_duplicates' => true,
'ai_moderation' => true,
'ai_harmful_content_filter' => true,
'ai_moderation_rules' => '<string>',
'ai_sentiment_filter' => [
]
]),
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.juicer.io/v1/feeds/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"sync_interval\": 123,\n \"queue\": true,\n \"allowed\": \"<string>\",\n \"disallowed\": \"<string>\",\n \"profanity\": true,\n \"prevent_duplicates\": true,\n \"ai_moderation\": true,\n \"ai_harmful_content_filter\": true,\n \"ai_moderation_rules\": \"<string>\",\n \"ai_sentiment_filter\": []\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.juicer.io/v1/feeds/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"sync_interval\": 123,\n \"queue\": true,\n \"allowed\": \"<string>\",\n \"disallowed\": \"<string>\",\n \"profanity\": true,\n \"prevent_duplicates\": true,\n \"ai_moderation\": true,\n \"ai_harmful_content_filter\": true,\n \"ai_moderation_rules\": \"<string>\",\n \"ai_sentiment_filter\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.juicer.io/v1/feeds/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"sync_interval\": 123,\n \"queue\": true,\n \"allowed\": \"<string>\",\n \"disallowed\": \"<string>\",\n \"profanity\": true,\n \"prevent_duplicates\": true,\n \"ai_moderation\": true,\n \"ai_harmful_content_filter\": true,\n \"ai_moderation_rules\": \"<string>\",\n \"ai_sentiment_filter\": []\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 123,
"name": "<string>",
"slug": "<string>",
"sources_count": 123,
"sync_interval": 123,
"update_frequency": 123,
"moderation": {
"enabled": true,
"allowed": "<string>",
"disallowed": "<string>",
"profanity_filter": true,
"prevent_duplicates": true,
"deduplication_strategy": "prioritize_top_source",
"ai_moderation_available": true,
"ai_moderation": true,
"ai_harmful_content_filter": true,
"ai_moderation_rules": "<string>",
"ai_sentiment_filter": [
"positive"
]
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "feed_limit_reached",
"message": "Your Free plan allows 1 feed(s). Upgrade to create more.",
"details": {
"name": [
"can't be blank"
]
},
"action": {
"type": "upgrade_plan",
"current_plan": "small",
"current_plan_display_name": "Free",
"required_plan": "large",
"required_plan_display_name": "Pro",
"upgrade_url": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
}
}
}Update feed settings
Updates feed settings, including manual and AI moderation.
AI moderation requires the Pro plan or higher. Enabling it
(ai_moderation or any AI sub-filter) on an unsupported plan returns
422 with error.code = "ai_moderation_not_available" and an
error.action of type upgrade_plan containing a magic link to the
upgrade page.
curl --request PATCH \
--url https://api.juicer.io/v1/feeds/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"sync_interval": 123,
"queue": true,
"allowed": "<string>",
"disallowed": "<string>",
"profanity": true,
"prevent_duplicates": true,
"ai_moderation": true,
"ai_harmful_content_filter": true,
"ai_moderation_rules": "<string>",
"ai_sentiment_filter": []
}
'import requests
url = "https://api.juicer.io/v1/feeds/{id}"
payload = {
"name": "<string>",
"sync_interval": 123,
"queue": True,
"allowed": "<string>",
"disallowed": "<string>",
"profanity": True,
"prevent_duplicates": True,
"ai_moderation": True,
"ai_harmful_content_filter": True,
"ai_moderation_rules": "<string>",
"ai_sentiment_filter": []
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
sync_interval: 123,
queue: true,
allowed: '<string>',
disallowed: '<string>',
profanity: true,
prevent_duplicates: true,
ai_moderation: true,
ai_harmful_content_filter: true,
ai_moderation_rules: '<string>',
ai_sentiment_filter: []
})
};
fetch('https://api.juicer.io/v1/feeds/{id}', 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.juicer.io/v1/feeds/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'sync_interval' => 123,
'queue' => true,
'allowed' => '<string>',
'disallowed' => '<string>',
'profanity' => true,
'prevent_duplicates' => true,
'ai_moderation' => true,
'ai_harmful_content_filter' => true,
'ai_moderation_rules' => '<string>',
'ai_sentiment_filter' => [
]
]),
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.juicer.io/v1/feeds/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"sync_interval\": 123,\n \"queue\": true,\n \"allowed\": \"<string>\",\n \"disallowed\": \"<string>\",\n \"profanity\": true,\n \"prevent_duplicates\": true,\n \"ai_moderation\": true,\n \"ai_harmful_content_filter\": true,\n \"ai_moderation_rules\": \"<string>\",\n \"ai_sentiment_filter\": []\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.juicer.io/v1/feeds/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"sync_interval\": 123,\n \"queue\": true,\n \"allowed\": \"<string>\",\n \"disallowed\": \"<string>\",\n \"profanity\": true,\n \"prevent_duplicates\": true,\n \"ai_moderation\": true,\n \"ai_harmful_content_filter\": true,\n \"ai_moderation_rules\": \"<string>\",\n \"ai_sentiment_filter\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.juicer.io/v1/feeds/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"sync_interval\": 123,\n \"queue\": true,\n \"allowed\": \"<string>\",\n \"disallowed\": \"<string>\",\n \"profanity\": true,\n \"prevent_duplicates\": true,\n \"ai_moderation\": true,\n \"ai_harmful_content_filter\": true,\n \"ai_moderation_rules\": \"<string>\",\n \"ai_sentiment_filter\": []\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 123,
"name": "<string>",
"slug": "<string>",
"sources_count": 123,
"sync_interval": 123,
"update_frequency": 123,
"moderation": {
"enabled": true,
"allowed": "<string>",
"disallowed": "<string>",
"profanity_filter": true,
"prevent_duplicates": true,
"deduplication_strategy": "prioritize_top_source",
"ai_moderation_available": true,
"ai_moderation": true,
"ai_harmful_content_filter": true,
"ai_moderation_rules": "<string>",
"ai_sentiment_filter": [
"positive"
]
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "feed_limit_reached",
"message": "Your Free plan allows 1 feed(s). Upgrade to create more.",
"details": {
"name": [
"can't be blank"
]
},
"action": {
"type": "upgrade_plan",
"current_plan": "small",
"current_plan_display_name": "Free",
"required_plan": "large",
"required_plan_display_name": "Pro",
"upgrade_url": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
}
}
}Authorizations
API key prefixed with jcr_. To obtain a key programmatically
(no dashboard required), see POST /v1/authorize.
Path Parameters
Body
How often the feed's sources are synced, in minutes. Allowed values are the standard sync frequencies 1, 5, 10, 30, 60, 240, and 1440 (once a day). Use 0 to archive the feed (stop updating it). Send null or an empty value to clear the override and fall back to your plan's default sync frequency (once a day on most plans). Setting it requires a plan that supports per-feed sync frequency; on other plans the request returns 422 with error.code = "sync_interval_not_available". On credit-metered API plans an invalid value is rejected with 422 (error.code = "invalid_sync_interval"). On credit-metered API plans each successful sync of a metered source consumes API credits, so a faster interval consumes credits proportionally faster (an hourly feed spends roughly 24x what a daily feed does); when the balance runs out the feed's sources pause until it is topped up.
Enable moderation queue
Comma-separated whitelist terms
Comma-separated blacklist terms
Enable profanity filter
Enable duplicate post prevention
Which post survives when duplicates are detected. prioritize_top_source keeps the post from the highest-priority source (lowest position). distribute_across_sources spreads the survivors across the feed's sources, so no one source wins every duplicate. It balances which source survives each set of duplicates, not the feed's overall share per source. Only meaningful when prevent_duplicates is true.
prioritize_top_source, distribute_across_sources Master switch for AI moderation. When enabled, new posts are queued and evaluated by AI before going live. Requires at least one AI sub-filter (ai_harmful_content_filter, ai_moderation_rules, or ai_sentiment_filter) to take effect. Requires the Pro plan or higher.
Check posts against the OpenAI moderation API and hold any flagged for harmful content (hate, violence, sexual, etc.).
Natural-language rules the AI applies when deciding whether to keep a post (e.g. "Only show posts about coffee").
Allowed post sentiments. Posts whose AI-classified sentiment is not in this list are held in the moderation queue. An empty array disables sentiment filtering.
positive, neutral, negative Response
Feed updated
Show child attributes
Show child attributes