Два заголовки, які часто плутають, описують різні напрямки:
Content-Type- формат тіла цього повідомлення. У запиті - що надсилає клієнт, у відповіді - що повертає сервер;Accept- формат, який клієнт готовий отримати у відповідь.
POST /api/reports
Content-Type: application/json
Accept: text/csv
{"from": "2026-09-01", "to": "2026-09-30"}
Клієнт надсилає JSON, а хоче отримати CSV.
Узгодження вмісту (content negotiation) - сервер обирає формат відповіді за Accept:
Accept: application/json;q=1.0, text/csv;q=0.5
q - вага переваги від 0 до 1. Сервер повертає найкращий з підтримуваних форматів, а якщо не підтримує жоден - 406 Not Acceptable. Якщо сервер не розуміє формат тіла запиту - 415 Unsupported Media Type.
Інші заголовки узгодження:
Accept-Language- мова (повідомлення помилок, перекладені поля);Accept-Encoding- стиснення (gzip,br,zstd);- у відповіді -
Vary: Accept, Accept-Language, щоб кеші й CDN зберігали окремі копії для різних варіантів.
Медіатипи для API:
application/json- основний;application/problem+json- помилки за RFC 9457;application/vnd.api+json- JSON:API;multipart/form-data- завантаження файлів;- власні «вендорні» типи з версією (
application/vnd.shop.v2+json) - один зі способів версіонування.
У Laravel:
$request->expectsJson()/wantsJson()перевіряютьAccept- від нього залежить, чи поверне Laravel помилки валідації й винятки як JSON;$request->isJson()- чи тіло запиту JSON (заContent-Type);$request->getAcceptableContentTypes()- список з урахуванням ваг.
Практичний підсумок: API-клієнти мають завжди надсилати Accept: application/json, а сервер - завжди виставляти правильний Content-Type відповіді з кодуванням (application/json для JSON вважається UTF-8 за специфікацією).