Pular para o conteúdo principal

Operações em Lote

Para turmas grandes — centenas ou milhares de formandos — a API oferece endpoints e padrões de lote para minimizar o número de requisições e reduzir o tempo de processamento.

Exclusão em lote

A maioria dos recursos suporta exclusão em lote via DELETE /recurso/batch/destroy com um corpo contendo UUIDs:
curl -X DELETE https://api.dokstamp.eu/certificates/batch/destroy \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Tenant: {TENANT}" \
  -d '{ "uuids": ["uuid-1", "uuid-2", "uuid-3"] }'

Emissão de certificados em lote (padrão)

Não existe um endpoint único de “criar certificados em lote” — cada certificado requer seu próprio arquivo exclusivo. No entanto, você pode otimizar o processo com um pipeline eficiente:

1. Enviar todos os arquivos em uma única requisição

curl -X POST https://api.dokstamp.eu/files \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Accept: application/json" \
  -H "X-Tenant: {TENANT}" \
  -F "files[]=@diploma-1.pdf" \
  -F "files[]=@diploma-2.pdf" \
  -F "files[]=@diploma-3.pdf"
A resposta inclui um array de objetos de arquivo. Mapeie cada arquivo para um estudante pelo nome do arquivo ou índice.

2. Emitir certificados de forma concorrente

Use requisições HTTP concorrentes (Promise.all em JavaScript, cURL paralelo, pool do Guzzle em PHP):
JavaScript
const issuances = students.map((student, index) => ({
  institution_uuid: INSTITUTION_UUID,
  course_uuid: COURSE_UUID,
  student_uuid: student.uuid,
  file_uuid: files[index].uuid,
  status: 'issued',
  issued_at: new Date().toISOString(),
}));

const results = await Promise.all(
  issuances.map(payload =>
    fetch('https://api.dokstamp.eu/certificates', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${TOKEN}`,
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'X-Tenant': TENANT,
      },
      body: JSON.stringify(payload),
    }).then(r => r.json())
  )
);

const verificationUrls = results.map(r => r.data.public_verification_url);
PHP (Guzzle pool)
use GuzzleHttp\Client;
use GuzzleHttp\Pool;
use GuzzleHttp\Psr7\Request;

$client = new Client(['base_uri' => 'https://api.dokstamp.eu']);
$headers = [
    'Authorization' => "Bearer $token",
    'Accept'        => 'application/json',
    'Content-Type'  => 'application/json',
    'X-Tenant'      => $tenant,
];

$requests = function () use ($students, $files, $headers) {
    foreach ($students as $i => $student) {
        $body = json_encode([
            'institution_uuid' => INSTITUTION_UUID,
            'course_uuid'      => COURSE_UUID,
            'student_uuid'     => $student['uuid'],
            'file_uuid'        => $files[$i]['uuid'],
            'status'           => 'issued',
            'issued_at'        => now()->toIso8601String(),
        ]);
        yield new Request('POST', 'certificates', $headers, $body);
    }
};

$pool = new Pool($client, $requests(), ['concurrency' => 10]);
$pool->promise()->wait();

Reenvio de requisições de assinatura em lote

Para fluxos de assinatura de documentos, reenvie e-mails de solicitação de assinatura para múltiplos signatários de uma vez:
POST /documents/signatures/batch/resend
curl -X POST https://api.dokstamp.eu/documents/signatures/batch/resend \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Tenant: {TENANT}" \
  -d '{
    "document_ids": [101, 102, 103]
  }'

Assinatura institucional em lote

Assine múltiplos documentos de uma vez com o certificado digital institucional:
POST /documents/batch/sign/{cert_id}
curl -X POST "https://api.dokstamp.eu/documents/batch/sign/1" \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Tenant: {TENANT}" \
  -d '{
    "document_ids": [101, 102, 103],
    "pin": "123456"
  }'

Paginação para grandes conjuntos de resultados

Ao buscar listas grandes (ex.: todos os estudantes para identificar certificados ausentes), use paginação:
# Buscar todas as matrículas concluídas em páginas de 200
PAGE=1
while true; do
  RESPONSE=$(curl -s "$API/enrollments?where[completion_status]=completed&per_page=200&page=$PAGE" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Accept: application/json" \
    -H "X-Tenant: $TENANT")
  
  TOTAL_PAGES=$(echo $RESPONSE | jq -r '.meta.last_page')
  echo "Processando página $PAGE de $TOTAL_PAGES"
  
  # Processar itens...
  
  [ "$PAGE" -ge "$TOTAL_PAGES" ] && break
  PAGE=$((PAGE + 1))
done