App integration

Submit deliverables in one setup call

Create the result, save its generation manifest, declare up to eight checksummed artifacts, and receive short-lived direct upload URLs with one API request.

SDK

import { BenchmarkClient } from "@ai3d/benchmark-client";

const client = new BenchmarkClient({
  baseUrl: "https://benchmark.ai3d.dev",
  getAccessToken: async () => process.env.AI3D_PUBLISHER_TOKEN
});

const submission = await client.createDeliverableSubmission({
  benchmarkId,
  publisher,
  visibility: "public",
  generationManifest,
  artifacts: [{
    artifactId,
    format: "ply",
    mimeType: "application/x-ply",
    byteSize: artifact.size,
    sha256: await client.hashSource(artifact)
  }]
});

for (const session of submission.uploadSessions) {
  const uploaded = await client.upload(session, artifactsById[session.artifactId], { onProgress });
  await client.completeArtifact(submission.resultId, session.artifactId, {
    uploadSessionId: session.uploadSessionId,
    parts: uploaded.parts
  });
}
await client.requestProcessing(submission.resultId);

HTTP

curl -X POST https://benchmark.ai3d.dev/api/v1/deliverable-submissions \
  -H "Authorization: Bearer $AI3D_PUBLISHER_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  --data @submission.json

Finish the benchmark

  1. Upload every byte range exactly as returned. Keep each multipart ETag.
  2. POST each completion to its returned completeUrl.
  3. Start processing, then poll statusUrl until awaiting-alignment.
  4. Submit alignment, canonical render, and metrics, then publish the immutable result.

Upload URLs expire after 15 minutes. Retry API mutations with the same idempotency key; request a new submission or upload session after URL expiry. Never expose publisher tokens in untrusted client code.

OpenAPI 3.1 JSON ↗ Full protocol →