curl --request POST \
--url https://api.olostep.com/v1/feedbacks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"note": "The markdown drops the pricing comparison table; expected all 4 rows.",
"issues": [
"missing_content",
"broken_formatting"
],
"affected_endpoint": "POST /v1/scrapes",
"related_object_id": "scrape_abc1234567",
"url": "https://example.com/pricing"
}
'import requests
url = "https://api.olostep.com/v1/feedbacks"
payload = {
"note": "The markdown drops the pricing comparison table; expected all 4 rows.",
"issues": ["missing_content", "broken_formatting"],
"affected_endpoint": "POST /v1/scrapes",
"related_object_id": "scrape_abc1234567",
"url": "https://example.com/pricing"
}
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({
note: 'The markdown drops the pricing comparison table; expected all 4 rows.',
issues: ['missing_content', 'broken_formatting'],
affected_endpoint: 'POST /v1/scrapes',
related_object_id: 'scrape_abc1234567',
url: 'https://example.com/pricing'
})
};
fetch('https://api.olostep.com/v1/feedbacks', 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.olostep.com/v1/feedbacks",
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([
'note' => 'The markdown drops the pricing comparison table; expected all 4 rows.',
'issues' => [
'missing_content',
'broken_formatting'
],
'affected_endpoint' => 'POST /v1/scrapes',
'related_object_id' => 'scrape_abc1234567',
'url' => 'https://example.com/pricing'
]),
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.olostep.com/v1/feedbacks"
payload := strings.NewReader("{\n \"note\": \"The markdown drops the pricing comparison table; expected all 4 rows.\",\n \"issues\": [\n \"missing_content\",\n \"broken_formatting\"\n ],\n \"affected_endpoint\": \"POST /v1/scrapes\",\n \"related_object_id\": \"scrape_abc1234567\",\n \"url\": \"https://example.com/pricing\"\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.olostep.com/v1/feedbacks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"note\": \"The markdown drops the pricing comparison table; expected all 4 rows.\",\n \"issues\": [\n \"missing_content\",\n \"broken_formatting\"\n ],\n \"affected_endpoint\": \"POST /v1/scrapes\",\n \"related_object_id\": \"scrape_abc1234567\",\n \"url\": \"https://example.com/pricing\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.olostep.com/v1/feedbacks")
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 \"note\": \"The markdown drops the pricing comparison table; expected all 4 rows.\",\n \"issues\": [\n \"missing_content\",\n \"broken_formatting\"\n ],\n \"affected_endpoint\": \"POST /v1/scrapes\",\n \"related_object_id\": \"scrape_abc1234567\",\n \"url\": \"https://example.com/pricing\"\n}"
response = http.request(request)
puts response.read_body{
"object": "feedback",
"id": "feedback_019e70f9-214a-74fc-a1ae-26fd3318be3e",
"category": "<string>",
"issues": [
"<string>"
],
"note": "<string>",
"created_at": "2026-10-23T00:00:00.000Z",
"affected_endpoint": "<string>",
"related_object_id": "<string>",
"url": "<string>"
}Soumettre un retour d’information
Indiquez-nous quand l’API a fait une erreur. Ne coûte aucun crédit.
curl --request POST \
--url https://api.olostep.com/v1/feedbacks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"note": "The markdown drops the pricing comparison table; expected all 4 rows.",
"issues": [
"missing_content",
"broken_formatting"
],
"affected_endpoint": "POST /v1/scrapes",
"related_object_id": "scrape_abc1234567",
"url": "https://example.com/pricing"
}
'import requests
url = "https://api.olostep.com/v1/feedbacks"
payload = {
"note": "The markdown drops the pricing comparison table; expected all 4 rows.",
"issues": ["missing_content", "broken_formatting"],
"affected_endpoint": "POST /v1/scrapes",
"related_object_id": "scrape_abc1234567",
"url": "https://example.com/pricing"
}
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({
note: 'The markdown drops the pricing comparison table; expected all 4 rows.',
issues: ['missing_content', 'broken_formatting'],
affected_endpoint: 'POST /v1/scrapes',
related_object_id: 'scrape_abc1234567',
url: 'https://example.com/pricing'
})
};
fetch('https://api.olostep.com/v1/feedbacks', 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.olostep.com/v1/feedbacks",
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([
'note' => 'The markdown drops the pricing comparison table; expected all 4 rows.',
'issues' => [
'missing_content',
'broken_formatting'
],
'affected_endpoint' => 'POST /v1/scrapes',
'related_object_id' => 'scrape_abc1234567',
'url' => 'https://example.com/pricing'
]),
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.olostep.com/v1/feedbacks"
payload := strings.NewReader("{\n \"note\": \"The markdown drops the pricing comparison table; expected all 4 rows.\",\n \"issues\": [\n \"missing_content\",\n \"broken_formatting\"\n ],\n \"affected_endpoint\": \"POST /v1/scrapes\",\n \"related_object_id\": \"scrape_abc1234567\",\n \"url\": \"https://example.com/pricing\"\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.olostep.com/v1/feedbacks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"note\": \"The markdown drops the pricing comparison table; expected all 4 rows.\",\n \"issues\": [\n \"missing_content\",\n \"broken_formatting\"\n ],\n \"affected_endpoint\": \"POST /v1/scrapes\",\n \"related_object_id\": \"scrape_abc1234567\",\n \"url\": \"https://example.com/pricing\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.olostep.com/v1/feedbacks")
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 \"note\": \"The markdown drops the pricing comparison table; expected all 4 rows.\",\n \"issues\": [\n \"missing_content\",\n \"broken_formatting\"\n ],\n \"affected_endpoint\": \"POST /v1/scrapes\",\n \"related_object_id\": \"scrape_abc1234567\",\n \"url\": \"https://example.com/pricing\"\n}"
response = http.request(request)
puts response.read_body{
"object": "feedback",
"id": "feedback_019e70f9-214a-74fc-a1ae-26fd3318be3e",
"category": "<string>",
"issues": [
"<string>"
],
"note": "<string>",
"created_at": "2026-10-23T00:00:00.000Z",
"affected_endpoint": "<string>",
"related_object_id": "<string>",
"url": "<string>"
}id de l’objet d’où il provient et nous pourrons le retracer jusqu’à la requête exacte.
Soumettre un retour d’information est gratuit, et cela fonctionne même lorsque les crédits de votre équipe sont épuisés.
Que faut-il envoyer
| Champ | Requis | Remarques |
|---|---|---|
category | oui | Un parmi output_quality, reliability, performance, documentation, api_usability, feature_gap, other |
note | oui | Ce qui s’est mal passé et ce que vous attendiez à la place, jusqu’à 4 000 caractères |
issues | non | Jusqu’à 20 codes de symptôme en snake_case, tels que missing_content ou timeout. Les codes documentés sont listés dans le schéma ; tout autre code de la même forme est accepté |
affected_endpoint | non | METHOD /path, par exemple POST /v1/scrapes |
related_object_id | non | L’id du scrape, batch, crawl, réponse, ou autre objet auquel le retour d’information se rapporte, ou l’error_… id lorsque l’appel a échoué |
url | non | La page à laquelle le retour d’information se rapporte, comme l’URL qui a été scrappée |
Exemple
curl -X POST https://api.olostep.com/v1/feedbacks \
-H "Authorization: Bearer <your_token>" \
-H "Content-Type: application/json" \
-d '{
"category": "output_quality",
"issues": ["missing_content", "broken_formatting"],
"note": "Le markdown omet le tableau de comparaison des prix ; attendu les 4 lignes.",
"affected_endpoint": "POST /v1/scrapes",
"related_object_id": "scrape_abc1234567",
"url": "https://example.com/pricing"
}'
feedback stocké avec son id et created_at. Il n’y a pas encore d’endpoint pour lister ou obtenir ; le retour d’information est lu de notre côté.Autorisations
En-tête d'authentification Bearer sous la forme Bearer , où est ton jeton d'authentification.
Corps
La raison principale du feedback.
output_quality, reliability, performance, documentation, api_usability, feature_gap, other Ce qui s'est mal passé et ce que tu attendais à la place.
1 - 4000"The markdown drops the pricing comparison table; expected all 4 rows."
Symptômes spécifiques, sous forme de codes en snake_case minuscules. Codes documentés : missing_content, incorrect_content, incomplete_content, broken_formatting, irrelevant_results, duplicate_results, stale_content, request_failed, timeout, slow_response, inconsistent_result, docs_mismatch, broken_example, confusing_schema, confusing_error, unsupported_website, unsupported_format. Tout autre code de la même forme est accepté.
20^[a-z0-9](?:[a-z0-9_]{0,78}[a-z0-9])?$["missing_content", "broken_formatting"]
Le point de terminaison concerné par le feedback, sous la forme METHOD /path avec le chemin pluriel canonique.
1 - 200"POST /v1/scrapes"
L'id de l'objet retourné par l'API auquel le feedback se réfère : un id de ressource scrape_…, batch_… ou similaire, ou l'id de l'objet d'erreur (error_…) lorsque l'appel a échoué.
1 - 128"scrape_abc1234567"
La page concernée par le feedback, comme l'URL qui a été scrappée.
2048"https://example.com/pricing"
Réponse
Le feedback enregistré.
feedback "feedback_019e70f9-214a-74fc-a1ae-26fd3318be3e"
"2026-10-23T00:00:00.000Z"
Cette page vous a-t-elle été utile ?