---
title: "Загрузить модуль функции своей версии"
method: POST
path: "/api/v1/developer/apps/{key}/versions/{version}/function-artifact"
tags: ["Developer account"]
---

# Загрузить модуль функции своей версии

`POST /api/v1/developer/apps/{key}/versions/{version}/function-artifact`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/developer/apps/{key}/versions/{version}/function-artifact`
- Auth: HTTP bearer

Байты `.wasm`, которые платформа исполняет в песочнице внутри операции кабинета. Та же операция по смыслу, что у персонала платформы, и то же правило: отпечаток можно прислать полем `digest` — тогда он сверяется с посчитанным по байтам, а не принимается на слово; повторная загрузка того же отпечатка той же версии — не ошибка и не запись.

ВЫПУЩЕННАЯ ВЕРСИЯ БАЙТОВ НЕ ПРИНИМАЕТ — то же правило, что у её манифеста: состав версии не меняется после ворот. Ворот `functions` сверил отпечатки один раз, манифест выпущенной версии не правится, и любые новые байты у неё — код, который не исполнится никогда.

ЗАГРУЖАЕТ ЧЕЛОВЕК, А НЕ КЛЮЧ ПРИЛОЖЕНИЯ. Ключ живёт в конвейере сборки, и утёкший из CI ключ, умеющий сменить исполняемый у клиента модуль, означал бы, что код внутри проведения меняется в обход человека. Читать состав версии ключу можно: конвейеру полагается знать, доехал ли его файл.

Годность модуля (импорты по белому списку, оба экспорта ABI, память в пределах) проверяется ПОСЛЕ сохранения и возвращается полем `verified`: негодный модуль — повод не публиковать версию, а не повод потерять загруженный файл.

## Path parameters

- `key` string, required
- `version` string, required

## Response `201`

Загруженный модуль

- DeveloperFunctionUploadResult
  - `upload` DeveloperFunctionUpload, required
    - `digest` string, required: Отпечаток, ПОСЧИТАННЫЙ по байтам. Присланный полем digest к этому моменту уже сверен
    - `size` integer, required
    - `created_at` string, date-time, required
    - `declared` boolean, required: Манифест версии называет этот отпечаток. Загрузка НЕ ОТКАЗЫВАЕТ модулю, которого манифест не называет: байты целы, а виноват может быть и файл, и манифест — какой из двух, решает издатель. Но узнать об этом он обязан сразу, а не от ворот публикации через день.
    - `verified` boolean, required: Модуль годен к исполнению: импорты по белому списку, оба экспорта ABI, память в пределах. При выключенной песочнице всегда true — рантайма нет, судить нечем.
    - `verify_reason` string: Машинный код негодности: forbidden_import, abi_missing, module_invalid, verify_failed. Слова на двух языках собирает портал
    - `verify_detail` string: То единственное, чего кодом не сказать: какой именно импорт запрещён, какого экспорта не хватает

## Other responses

- `400`: Некорректный запрос или нарушение бизнес-правила
- `401`: Сессия, ключ или кабинет не подтверждены
- `403`: Ключ приложения модуль не подкладывает: загрузка человеческая
- `404`: Приложения или версии нет; тот же ответ получает чужой ключ
- `409`: Отпечаток не сходится с содержимым файла либо версия уже выпущена
- `413`: Модуль больше 4 МБ
- `503`: Хранилище модулей в этой сборке не собрано

---

[API](https://skmtc.dev/akeda/apis/akeda-erp-client-api.md) · [All operations](https://skmtc.dev/akeda/apis/akeda-erp-client-api/llms.txt) · [OpenAPI document](https://skmtc.dev/akeda/apis/akeda-erp-client-api/revisions/3c60ded179f2?raw)
