Record a meeting and retrieve its outputs
This is the shortest supported path from a meeting in your product to generated documents in your storage. The OAuth client secret and service access token stay in your backend. Your browser receives only a short-lived upload instruction.
Examples use Rust because it is the first released server SDK. TypeScript and Python will be added as tabs on this page, not as separate guides.
Read Model your meetings before you design your own tables. One meeting carries ONE recording, so a gathering captured in several sittings is several Revero meetings. Getting that backwards costs a migration.
Before you start
Ask your Revero organisation administrator for a client id and client secret with these scopes:
meetings:writeto create meetings;recordings:writeto prepare and complete recordings; andmeetings:readto read meetings, operations and outputs.
Store both values as backend-only secrets. The SDK knows the production base
URL, https://api.revero.no; pick Environment::Staging only when your
organisation has been provisioned there.
1. Create the backend client
The client exchanges your credentials through OAuth Client Credentials and caches the short-lived service token. Do not add a token route to your frontend.
Rust
2. Create the meeting
external_id is your stable identifier. Reusing it returns the same meeting,
which makes a lost response safe to replay. output_profiles names the
documents you need; GET /output-profiles lists the keys your organisation may
ask for, and an unknown key is refused as unknown_output_profile with the
valid ones named. Put authoritative facts that generation must not reinterpret
in locked_context.
Rust
External ids are unique inside your Revero organisation, not globally.
3. Prepare browser upload
Prepare one recording from your backend. Return only the upload object and
the recording id to the browser. Preserve the method, URL and headers exactly;
they are one short-lived instruction, not fields to reinterpret.
Rust
The ready-made React component and headless alternative are shown in Record from a browser. Three things belong in your frontend and are easy to leave out until a real meeting finds them:
- A break.
pause()andresume()keep one recording open across a lunch break, which is one transcript with no gap rather than two meetings to reconcile. - A refused microphone.
state.errorCodeismicrophone_denied, and it needs a different sentence and a different button than a failed upload. Branch on the code; never parse the message. - An interrupted recording. Audio survives a closed tab in IndexedDB.
Restored state carries
restored: trueand the originalstartedAt, so tell the person what you found rather than showing a bare send button.
4. Upload directly, then complete from the backend
The browser sends the audio straight to the provided URL with the provided
method and headers. Once that upload succeeds, call complete from your
backend with an idempotency key that you persist with the command.
Rust
If the network drops before you see the response, replay with the same key.
Revero returns the same operation and does not start duplicate work. Use a new
key only after a terminal failure explicitly says retryable: true.
5. Wait for authoritative operation state
Operations and meetings are authoritative; webhooks only reduce how long you
wait before reading them. Every wait must have a deadline. The SDK honours
Retry-After on 429, applies bounded backoff between other non-terminal
reads, and returns the last typed operation when the deadline expires.
Rust
Branch on stable error and failure codes, never on their human-readable messages.
6. Retrieve and store outputs
List the meeting outputs and fetch the completed ones. The returned content is your application data: copy it into the long-term storage and access-control model you promise your users. Revero’s temporary copy follows your organisation’s configured retention policy.
Rust
content for a generated document is CommonMark, and sentences grounded in
the meeting are wrapped in <cite> elements. Rendering it raw shows that markup
to your users. What the documents contain has the shape of each
profile and a one-line way to remove the tags.
7. Verify webhooks and reconcile
Verify Flyt-Signature against the raw request bytes before parsing JSON.
Reject timestamps more than five minutes from your clock and accept any valid
v1 signature during secret rotation. Deduplicate on the envelope id, also
sent as Flyt-Event-Id; delivery is at-least-once and unordered.
Rust
Return 2xx quickly. Revero retries 429, 5xx and timeouts, does not follow
redirects, and permanently stops on other 4xx responses.
Give this task to a coding agent
Copy the prompt below into an agent working in your Rust/Axum and Next.js/React repository. It deliberately names the source of truth and the complete outcome.
The Revero release harness runs this prompt against clean Axum and Next.js fixtures and compiles the result against the packed package candidates. A prose review is not considered verification.