Cotasky API

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()));

Ошибки и лимиты

401AUTH_REQUIREDНет валидной сессии.
402insufficient_creditsНедостаточно credits.
400Unsupported target formatНеподдерживаемый формат.
422CONVERSION_FAILEDНе удалось сконвертировать файл.

Credits: Piconvi списывает за файл по тарифу сервиса, Doconvi — 1 credit за страницу. Doconvi списывает credits только после успешной финальной сборки файла.