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
- Upload every byte range exactly as returned. Keep each multipart
ETag. - POST each completion to its returned
completeUrl. - Start processing, then poll
statusUrluntilawaiting-alignment. - 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.