VRPlatformVRPlatform
Run in Production

Troubleshooting

Diagnose integration failures from scope, state, and structured errors

Each section follows the same shape: symptom, likely cause, fix, and where to read the exact contract.

Authentication or Team Selection

Symptom: requests fail with 401 or 403.

Likely cause: wrong API base URL, wrong credential type, a disabled or expired key, missing team access, or a partner-scoped route called with a team selector (or the reverse).

Fix: verify the public API base URL, then credential type, key status, and team access. Send only the team selector the route documents, and never fall back to another accessible team after a write failure.

See: Team Context, Read the selected team — GET /team, and Error Contract.

Embedded Session

Symptom: the embedded UI fails to authenticate, or stops working after a few minutes.

Likely cause: the browser received a partner API key instead of a session bearer token, the session passed expiresAt, or the issued team does not match the team the iframe shows. Unknown embedded users fail session creation unless auto-provisioning is enabled; inactive users need account repair.

Fix: sessions must come from your backend and be refreshed before expiresAt. Keep the session and iframe on the same team, and provision or repair the embedded user.

See: Issue Sessions and Issue an embedded session — POST /partner/embed-sessions.

Connection Creation

Symptom: creating or connecting a source fails, or an OAuth callback does not complete.

Likely cause: an appId that does not exactly match GET /apps, callback parameters altered in transit, or the OAuth flow completed under a different team than the one that initiated the signed state.

Fix: take the appId verbatim from GET /apps, return callback params unchanged, and complete the flow under the team that started it. If a provider response left the outcome uncertain, read current connection and sync state before acting again.

See: Connections, List apps — GET /apps, Create a connection — POST /connections, and Connect an app — POST /connections/connect.

Team Issues

Symptom: GET /teams/issues returns 400 or an initial 503.

Likely cause: for 400, an invalid team UUID, unknown issue code, stale cursor, or another strict query parameter. For 503, a team in scope whose first issue snapshot is not yet materialized.

Fix: for 400, validate UUIDs, codes, and cursors against the generated contract. For 503, retry after retryAfterSeconds, or scope teamIds to exclude the teams listed in pendingTeamIds. When consuming events, compare snapshot versions and replace local issue state rather than merging event codes.

See: Portfolio health, Read team issues — GET /teams/issues, and Error Contract.

Webhook Delivery

Symptom: deliveries fail, stop arriving, or are rejected by your receiver.

Likely cause: signature verification against a parsed (not raw) body, a receiver that returns non-2xx before durable processing, or a subscription disabled by 410 or by delete.

Fix: the delivery endpoints show attempts, response status, a sanitized excerpt, and the next attempt time; start there. Verify the signature over the raw body, and return 2xx only once processing is durable. Once the receiver is fixed, replay the existing delivery instead of creating a second subscription.

See: Webhooks, Inspect deliveries — GET /webhook-deliveries, and Replay a delivery — POST /webhook-deliveries/{id}/replay.

Batch Imports

Symptom: batch submissions are rejected, or accepted batches do not produce the expected data.

Likely cause: wrong team context, unstable uniqueRef values that create duplicates or update the wrong record, or item payloads that fail the operation's schema or business rules.

Fix: verify x-api-key and x-team-id, and keep uniqueRef stable per source record. A batch is not all-or-nothing: process the response item by item, since each outcome appears in data and failures arrive as structured issues. For risky batches, validate first with the dryRun parameter where the operation declares it.

See: Batch imports, Contact batch — POST /contacts/batch, Listing batch — POST /listings/batch, Reservation batch — POST /reservations/batch, Transaction batch — POST /transactions/batch, Bank-account batch — POST /bank-accounts/batch, and Bank-record batch — POST /bank-records/batch.

Escalation

If the structured error and generated operation do not explain the failure, provide support with timestamp, route, team ID, correlation ID, and redacted request shape.

On this page