Принята не значит попала в блок
Успешный ответ означает, что эндпоинт Apex получил вашу транзакцию и отправляет её лидерам наперегонки, пока она не попадёт в блок или пока не истечёт её blockhash. Он не означает, что транзакция попала в блок. Подтверждайте каждую отправку черезgetSignatureStatuses на Solana RPC. См. Лучшие практики.
Apex проверяет транзакцию в таком порядке: API-ключ, лимит запросов, корректность и размер транзакции, затем чаевые. Ошибку определяет первая непройденная проверка. Пока не пройдены все проверки, ничего никуда не отправляется, поэтому отклонённая транзакция ничего не стоит.
Ошибки JSON-RPC
Ошибки простых HTTP-маршрутов
На/send и /send-bin успехом считается HTTP 200 с {"signature": "..."}. /send-batch отвечает 200 с {"attempted": n, "accepted": n, "rejected": n, "results": [...]}, где каждый результат, в порядке фреймов, представляет собой либо {"signature": "..."}, либо {"error": "<label>", "message": "..."}. /send-bundle отвечает 200 с {"bundle_id": "...", "signatures": ["...", "..."]}.
Ошибки возвращаются в JSON с машиночитаемой меткой и понятным человеку сообщением:
Сначала ветвите логику по HTTP-статусу. Это стабильная часть контракта. Незнакомую метку при статусе
400 трактуйте как «исправьте транзакцию»./send-batch отвечает 200 всякий раз, когда сам запрос сформирован правильно, и сообщает о каждом фрейме отдельно внутри results. Проверяйте rejected и каждую запись, а не только код статуса. См. POST /send-batch.
Метка bundle (HTTP 400) означает, что бандл отклонён целиком: в нём больше 4 участников, есть повторяющийся участник, бандлы недоступны для этого ключа или эндпоинта либо его отклонил block engine. Проблема отдельного участника сохраняет собственную метку. Участник больше 1232 байт возвращается как malformed с сообщением, в котором назван лимит 1232 байта, два участника с чаевыми дают multiple_tips, а отсутствие участника с чаевыми даёт no_tip.
Ошибки чаевых подробно
Коды допуска QUIC
Двунаправленный QUIC-поток отвечает одним кодом допуска. Однонаправленный поток ничего не возвращает, поэтому на время интеграции используйте двунаправленный поток.
Если отклонено само рукопожатие QUIC, соединение закрывается с ошибкой приложения
1 (нет клиентского сертификата), 2 (неизвестный ключ) или 3 (слишком много соединений). См. Аутентификация.
В клиенте на Rust send_transaction_with_response превращает отклонение в Error::Rejected { code, message }, а транзакция больше 4096 байт завершается локальной ошибкой Error::TooLarge до того, как что-либо будет отправлено.
Какие ошибки повторять
Принятую транзакцию отправлять повторно не нужно. Apex уже повторяет её отправку, пока она не попадёт в блок или пока не истечёт blockhash. Если к этому моменту она не попала в блок, соберите её заново со свежим blockhash и отправьте новую транзакцию.
Лимиты запросов
Лимиты запросов действуют на каждый API-ключ и задаются тарифом ключа. Лимит считает транзакции в секунду по всем транспортам: JSON-RPC, HTTP-маршруты и QUIC расходуют одну и ту же квоту, а каждый фрейм пакета считается одной транзакцией. При превышении лимита вы получаете-32029, HTTP 429 или код допуска 2. Отклонённая транзакция не ставится в очередь, поэтому отправьте её снова чуть позже, если она всё ещё важна.
Лимит и минимум чаевых вашего тарифа показаны рядом с ключом в панели управления OrbitFlare в разделе Dashboard > Apex. Чтобы повысить их, свяжитесь с командой в Discord.