API для Piconvi и Doconvi
Интегрируйте конвертацию изображений и документов в свои сервисы. Ниже — текущие REST endpoints, авторизация, формат payload и готовые примеры.
Авторизация
Внешний API доступен только по API ключу. Сгенерируйте ключ на сайте: Профиль → Настройки → Активировать API. Передавайте ключ в одном из заголовков:
x-api-key: YOUR_COTASKY_API_KEY
Authorization: Bearer YOUR_COTASKY_API_KEYЗапросы к https://api.cotasky.tech/api/* без ключа всегда возвращают 401 API_KEY_REQUIRED. Credits списываются со счета пользователя, которому принадлежит ключ.
Piconvi API — конвертация изображений
Сценарий: получить форматы → запросить quote → создать job → polling status → скачать готовые файлы.
Endpoints
| GET | /api/piconvi/formats | Список входных/выходных форматов. |
|---|---|---|
| GET | /api/piconvi/credits/quote?files=2 | Расчет credits для количества файлов. |
| POST | /api/piconvi/jobs | Создать задачу конвертации. |
| GET | /api/piconvi/jobs/:jobId/status | Статус задачи и ссылки на скачивание. |
| GET | /api/piconvi/jobs/:jobId/files/:fileId/download | Скачать результат. |
| DELETE | /api/piconvi/jobs/:jobId | Отменить задачу. |
Создание Piconvi job
curl -X POST https://api.cotasky.tech/api/piconvi/jobs -H "content-type: application/json" -H "x-api-key: YOUR_COTASKY_API_KEY" -d '{
"targetFormat": "webp",
"files": [
{
"filename": "photo.jpg",
"dataBase64": "BASE64_FILE_CONTENT"
}
]
}'
Polling и скачивание
curl https://api.cotasky.tech/api/piconvi/jobs/JOB_ID/status
curl -L -H "x-api-key: YOUR_COTASKY_API_KEY" -o converted.webp https://api.cotasky.tech/api/piconvi/jobs/JOB_ID/files/FILE_ID/download
JavaScript пример
const apiKey = 'YOUR_COTASKY_API_KEY';
const file = document.querySelector('input[type=file]').files[0];
function toBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(String(reader.result).split(',')[1]);
reader.onerror = reject;
reader.readAsDataURL(file);
});
}
const job = await fetch('https://api.cotasky.tech/api/piconvi/jobs', {
method: 'POST',
headers: { 'content-type': 'application/json', 'x-api-key': apiKey },
body: JSON.stringify({
targetFormat: 'png',
files: [{ filename: file.name, dataBase64: await toBase64(file) }]
})
}).then(r => r.json());
const status = await fetch(
'https://api.cotasky.tech/api/piconvi/jobs/' + job.jobId + '/status'
).then(r => r.json());
console.log(status.files);Doconvi API — документы, страницы и финальная сборка
Сценарий: создать project из файлов → получить страницы → сохранить порядок/формат → финально конвертировать и скачать файл.
Endpoints
| GET | /api/doconvi/formats | Единый input/output набор форматов. |
|---|---|---|
| POST | /api/doconvi/projects | Создать проект и нормализовать файлы в страницы. |
| GET | /api/doconvi/projects/:projectId | Получить проект, страницы, порядок и стоимость. |
| PATCH | /api/doconvi/projects/:projectId | Сохранить порядок страниц, target format или удаленные страницы. |
| POST | /api/doconvi/projects/:projectId/attach | Привязать гостевой проект к пользователю после логина. |
| GET | /api/doconvi/projects/:projectId/pages/:pageId/preview | Предпросмотр страницы. |
| POST | /api/doconvi/projects/:projectId/convert | Финальная конвертация и скачивание результата. |
Создать проект
curl -X POST https://api.cotasky.tech/api/doconvi/projects -H "content-type: application/json" -H "x-api-key: YOUR_COTASKY_API_KEY" -d '{
"anonymousProjectId": "optional-client-uuid",
"files": [
{ "filename": "contract.pdf", "dataBase64": "BASE64_PDF" },
{ "filename": "notes.docx", "dataBase64": "BASE64_DOCX" }
]
}'
Сохранить порядок страниц
curl -X PATCH https://api.cotasky.tech/api/doconvi/projects/PROJECT_ID -H "content-type: application/json" -H "x-api-key: YOUR_COTASKY_API_KEY" -d '{
"targetFormat": "docx",
"order": ["PAGE_ID_3", "PAGE_ID_1", "PAGE_ID_2"],
"deletedPages": ["PAGE_ID_4"]
}'
Финальная конвертация
curl -X POST https://api.cotasky.tech/api/doconvi/projects/PROJECT_ID/convert -H "content-type: application/json" -H "x-api-key: YOUR_COTASKY_API_KEY" -d '{
"targetFormat": "pdf",
"order": ["PAGE_ID_1", "PAGE_ID_2", "PAGE_ID_3"]
}' --output result.pdf
Node.js пример
import { readFile, writeFile } from 'node:fs/promises';
const apiKey = 'YOUR_COTASKY_API_KEY';
const baseUrl = 'https://doconvi.cotasky.tech';
const pdfBase64 = (await readFile('./contract.pdf')).toString('base64');
const project = await fetch(baseUrl + '/api/doconvi/projects', {
method: 'POST',
headers: { 'content-type': 'application/json', 'x-api-key': apiKey },
body: JSON.stringify({
files: [{ filename: 'contract.pdf', dataBase64: pdfBase64 }]
})
}).then(r => r.json());
// reverse page order as an example
const order = [...project.order].reverse();
await fetch(baseUrl + '/api/doconvi/projects/' + project.id, {
method: 'PATCH',
headers: { 'content-type': 'application/json', 'x-api-key': apiKey },
body: JSON.stringify({ targetFormat: 'docx', order })
});
const response = await fetch(baseUrl + '/api/doconvi/projects/' + project.id + '/convert', {
method: 'POST',
headers: { 'content-type': 'application/json', 'x-api-key': apiKey },
body: JSON.stringify({ targetFormat: 'docx', order })
});
if (!response.ok) throw new Error(await response.text());
await writeFile('./result.docx', Buffer.from(await response.arrayBuffer()));Ошибки и лимиты
| 401 | AUTH_REQUIRED | Нет валидной сессии. |
|---|---|---|
| 402 | insufficient_credits | Недостаточно credits. |
| 400 | Unsupported target format | Неподдерживаемый формат. |
| 422 | CONVERSION_FAILED | Не удалось сконвертировать файл. |
Credits: Piconvi списывает за файл по тарифу сервиса, Doconvi — 1 credit за страницу. Doconvi списывает credits только после успешной финальной сборки файла.