API Topic получает не те посты — постоянно сдвиг на 5

/t/slug/123.json?post_number=10 возвращает 5-й пост. /t/slug/123.json?post_number=50 возвращает 45-й пост и так далее. Смещение всегда составляет 5. Если вы хотите получить все посты, необходимо использовать пагинацию, и если не учесть это смещение, вы получите неверный список.

Я могу лишь предположить, что это сделано для включения нескольких предыдущих постов для контекста. Если это так, то, на мой взгляд, это должно реализовываться на уровне интерфейса, а не API.

Этот конечный пункт обещает вернуть информацию включая указанный пост, например:

○ → curl -s 'https://meta.discourse.org/t/fkb-pro-social-theme/234323.json?post_number=40' | jq .post_stream.posts[].post_number
33
34
35
36
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

Как одностраничное приложение, Discourse эффективно использует свой API для минимизации работы. Нерационально делать один вызов API на каждый пост; это резко увеличило бы количество обменов данными между клиентом и сервером.

Тривиально выбрать ожидаемый пост из результата. Как и выше, получение только обработанного содержимого поста 40:

○ → curl -s 'https://meta.discourse.org/t/fkb-pro-social-theme/234323.json?post_number=40' | jq -r '.post_stream.posts[] | select(.post_number == 40) | .cooked'
<p>Привет, Ти́аго,</p>
<p>Не могли бы вы немного уточнить? Несколько скриншотов, ваш реальный код и место появления вашей рекламы были бы очень полезны. Спасибо <img src="https://emoji.discourse-cdn.com/twitter/slightly_smiling_face.png?v=12" title=":slightly_smiling_face:" class="emoji" alt=":slightly_smiling_face:" loading="lazy" width="20" height="20"></p>

Или, если вы абсолютно хотите возвращать информацию только об одном запрашиваемом посте, вы можете выполнить запрос Data Explorer, который делает именно это.

Хорошо, но где это задокументировано?

Я не против пагинации.

Документацию API можно найти здесь: https://docs.discourse.org/#tag/Topics/operation/getSpecificPostsFromTopic