Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.prudra.dev/llms.txt

Use this file to discover all available pages before exploring further.

Vault access

After a successful payment, the server returns a vaultId. Use it to access results — documents, files, and real-time progress events.

Read vault contents

The server includes a vault access token or you can use your API key:
async function readVault(vaultId: string, accessToken: string) {
  const response = await fetch(
    `https://api.prudra.dev/vaults/${vaultId}`,
    { headers: { Authorization: `Bearer ${accessToken}` } }
  );

  const vault = await response.json();

  // Documents
  for (const doc of vault.documents) {
    console.log(doc.label, doc.data);
  }

  // Files — CDN URLs
  for (const file of vault.files) {
    console.log(file.name, file.url);
  }
}

Subscribe to real-time progress

When the server is streaming results, subscribe to the SSE event stream:
import EventSource from 'eventsource';

async function streamVaultEvents(vaultId: string, accessToken: string) {
  return new Promise<void>((resolve, reject) => {
    const es = new EventSource(
      `https://api.prudra.dev/vaults/${vaultId}/events`,
      { headers: { Authorization: `Bearer ${accessToken}` } }
    );

    es.onmessage = (event) => {
      const data = JSON.parse(event.data);

      switch (data.type) {
        case 'job.progress':
          console.log(`Progress: ${data.payload.current}/${data.payload.total}`);
          break;

        case 'vault.sealed':
          console.log('Job complete:', data.payload.summary);
          es.close();
          resolve();
          break;
      }
    };

    es.onerror = (err) => {
      es.close();
      reject(new Error('SSE connection failed'));
    };
  });
}

// Usage
const result = await fetch(serverUrl, { method: 'POST', ... });
const { vaultId, accessToken, streamUrl } = await result.json();

// Subscribe to events while server processes
await streamVaultEvents(vaultId, accessToken);

// Read final results
const vault = await readVault(vaultId, accessToken);

Download files

CDN URLs from vault files are publicly accessible — no auth required:
const vault = await readVault(vaultId, accessToken);

for (const file of vault.files) {
  const fileResponse = await fetch(file.url);
  const buffer = Buffer.from(await fileResponse.arrayBuffer());
  // Process the file
}

Full pattern: pay, stream, read

async function callAndStream(
  serverUrl:   string,
  body:        unknown,
  wallet:      ethers.Wallet,
) {
  // 1. Pay
  const response = await callWithX402(serverUrl, body, wallet);
  if (!response.ok) throw new Error(`Failed: ${response.status}`);

  const { vaultId, accessToken } = await response.json();

  // 2. Stream events until sealed
  await streamVaultEvents(vaultId, accessToken);

  // 3. Read results
  return readVault(vaultId, accessToken);
}