Biklo for developersTESTsandbox-api.biklo.comchange

List questions on your listings

GET/v1/questions

scope questions.read

Public questions — these render on the product page for every future buyer, so an unanswered one is visible to everyone. unanswered_count is carried on every response so you can badge it without a second call.

Query parameters#

NameExample
limit50Max 100
cursor—next_cursor
unanswered_onlytrueOnly questions still waiting
product_id237233Only questions on one listing
updated_since2026-09-01T00:00:00ZIncremental sync

Response#

FieldTypeDescription
countintegerHow many questions in this page.
next_cursorstring|nullPass back as ?cursor=; null on the last page.
unanswered_countintegerHow many of YOUR questions have no answer at all — across every page, not just this one. Poll this cheaply to know whether there is anything to do.
dataarrayPublic questions on your listings. Unlike a conversation, everyone browsing the listing reads these.
data[].idintegerThe question id, for POST /v1/questions/{id}/answer.
data[].textstringWhat was asked, publicly, on your listing.
data[].productobjectThe listing it was asked about.
data[].product.idintegerOur product id.
data[].product.titlestringIts title.
data[].product.slugstringIts URL segment.
data[].asked_byobject|nullWho asked.
data[].asked_by.idintegerTheir user id.
data[].asked_by.namestringTheir display name.
data[].is_answeredbooleanWhether any answer exists. This is what to filter an unanswered queue on.
data[].answered_atstring|nullISO-8601 UTC of the first answer, or null.
data[].votesobjectHow buyers reacted. A question with several same_question votes is one worth answering well — everyone reading the listing sees it.
data[].votes.helpfulintegerVotes saying the answer helped.
data[].votes.not_helpfulintegerVotes saying it did not.
data[].votes.same_questionintegerBuyers saying they wanted to know the same thing.
data[].answersarrayEvery answer, yours and anyone else's.
data[].answers[].idintegerThe answer id.
data[].answers[].textstringThe answer text.
data[].answers[].is_from_sellerbooleantrue is you. Other buyers can answer too, and theirs carry the same weight on the page — which is a reason to answer first.
data[].answers[].author_namestring|nullWho wrote it.
data[].answers[].created_atstringISO-8601 UTC.
data[].answers[].updated_atstringISO-8601 UTC.
data[].created_atstringISO-8601 UTC, when it was asked.
data[].updated_atstringISO-8601 UTC.

Example

{
    "count": 2,
    "next_cursor": null,
    "unanswered_count": 1,
    "data": [
        {
            "id": 31,
            "text": "What frame size is this?",
            "product": {
                "id": 237233,
                "title": "Trek Marlin 7",
                "slug": "trek-marlin-7"
            },
            "asked_by": {
                "id": 9000002,
                "name": "Jane Doe"
            },
            "is_answered": false,
            "answered_at": null,
            "votes": {
                "helpful": 0,
                "not_helpful": 0,
                "same_question": 0
            },
            "answers": [],
            "created_at": "2026-09-10T06:21:50Z",
            "updated_at": "2026-09-10T06:21:50Z"
        },
        {
            "id": 30,
            "text": "Does it come with pedals?",
            "product": {
                "id": 237233,
                "title": "Trek Marlin 7",
                "slug": "trek-marlin-7"
            },
            "asked_by": {
                "id": 9000003,
                "name": "Maria I."
            },
            "is_answered": true,
            "answered_at": "2026-09-09T11:04:12Z",
            "votes": {
                "helpful": 2,
                "not_helpful": 0,
                "same_question": 1
            },
            "answers": [
                {
                    "id": 14,
                    "text": "Yes, flat pedals are included.",
                    "is_from_seller": true,
                    "author_name": "Bike Shop SRL",
                    "created_at": "2026-09-09T11:04:12Z",
                    "updated_at": "2026-09-09T11:04:12Z"
                }
            ],
            "created_at": "2026-09-09T10:58:03Z",
            "updated_at": "2026-09-09T11:04:12Z"
        }
    ]
}

Failures use the shared error envelope — a machine-readable code and a request_id to quote to support. Error handling.

curl -X GET "https://sandbox-api.biklo.com/v1/questions?limit=50" \
  -H "Authorization: Bearer bk_test_YOUR_KEY"
<?php

$ch = curl_init('https://sandbox-api.biklo.com/v1/questions?limit=50');

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'GET',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer bk_test_YOUR_KEY',
    ],
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);
using System.Net.Http;
using System.Net.Http.Headers;

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "bk_test_YOUR_KEY");

var request = new HttpRequestMessage(
    new HttpMethod("GET"),
    "https://sandbox-api.biklo.com/v1/questions?limit=50");

var response = await client.SendAsync(request);
var json = await response.Content.ReadAsStringAsync();
import requests

response = requests.get(
    "https://sandbox-api.biklo.com/v1/questions?limit=50",
    headers={"Authorization": "Bearer bk_test_YOUR_KEY"},
)

data = response.json()
const response = await fetch("https://sandbox-api.biklo.com/v1/questions?limit=50", {
  method: "GET",
  headers: {
    Authorization: "Bearer bk_test_YOUR_KEY"
  }
});

const data = await response.json();
import java.net.http.*;
import java.net.URI;

var client = HttpClient.newHttpClient();

var request = HttpRequest.newBuilder()
    .uri(URI.create("https://sandbox-api.biklo.com/v1/questions?limit=50"))
    .header("Authorization", "Bearer bk_test_YOUR_KEY")
    .method("GET", HttpRequest.BodyPublishers.noBody())
    .build();

var response = client.send(request, HttpResponse.BodyHandlers.ofString());