Snappt · AsyncAPI Specification
Snappt Enterprise Api Webhooks
Version
View Spec
View on GitHub
Companyfraud-detectiondocument-verificationidentity-verificationincome-verificationproperty-managementmultifamilyreal-estateproptechtenant-screeningrental-applicationswebhooksAsyncAPIWebhooksEvents
AsyncAPI Specification
generated: '2026-08-05'
method: searched
source:
- https://snappt-enterprise-api.readme.io/docs/webhook-event-types
- https://snappt-enterprise-api.readme.io/docs/webhook-event-types-identity-verification
- https://snappt-enterprise-api.readme.io/docs/webhook-delivery-retry-behavior
- https://snappt-enterprise-api.readme.io/docs/webhook-snappt-signature-v2
spec_type: Webhooks
asyncapi_published: false
note: >-
Snappt documents a complete outbound-webhook surface but publishes no AsyncAPI document. This
artifact captures the webhook catalog as documented; no AsyncAPI file has been fabricated.
direction: outbound (Snappt -> partner endpoint)
management:
register: POST /webhooks
list: GET /webhooks
retrieve: GET /webhooks/{id}
update: PUT /webhooks/{id}
delete: DELETE /webhooks/{id}
signing_secret: GET /webhooks/{id}/signing-secret
subscription_model: per-webhook `events` array — a webhook only receives events whose type it lists
inactive: isActive=false stops all deliveries and redeliveries for that webhook
envelope:
fields:
- {name: eventType, type: string, description: One of the event types below}
- {name: apiKeyId, type: uuid, description: The API key whose webhook is being delivered}
- {name: webhookId, type: uuid, description: The webhook that produced this delivery}
- {name: applicantId, type: 'uuid|null', description: The applicant this event is about; null for IDV_REPORT_READY}
- {name: applicantDetailId, type: 'uuid|null', description: The applicant-detail record; null for IDV_REPORT_READY}
- {name: externalId, type: 'string|null', description: Partner identifier echoed back; always null on IDV_REPORT_READY}
- {name: externalMetadata, type: 'object|null', description: Partner metadata echoed back unchanged; always null on IDV_REPORT_READY}
- {name: data, type: object, description: Event-specific payload}
- {name: update, type: object, description: Present only on REPORT_UPDATED; describes why the report changed}
events:
- name: APPLICATION_SUBMITTED
fires_when: An applicant finishes submitting their documents, before any review has run.
retried: false
delivery: single attempt only
data_fields:
- {name: id, type: uuid, description: The entry (applicant) id; use with eventType as an idempotency key}
- {name: note, type: 'string|null', description: Reviewer note; null at submission time}
- {name: result, type: string, values: [PENDING]}
- {name: status, type: string, values: [PENDING]}
- name: REPORT_READY
fires_when: >-
Snappt has finished reviewing the applicant's documents for authenticity — and for income when
Income Verification is enabled on the property — and has rendered a verdict. Always the first
report event for an applicant.
retried: true
retry_window: up to 24 hours after the report completed
retry_cadence: every ~61-70 minutes (~20-24 attempts); stops on HTTP 200
data_fields:
- {name: id, type: uuid, description: The entry (applicant) id}
- {name: note, type: 'string|null', description: Human-readable note, populated for some EDITED and UNDETERMINED verdicts}
- {name: result, type: string, description: The fraud verdict}
- {name: status, type: string, values: [READY]}
result_values:
- {meaning: Documents look authentic, default_display: CLEAN, alt_display: PASSED}
- {meaning: Evidence of editing/fraud, default_display: EDITED, alt_display: FAILED}
- {meaning: 'Could not be determined (for example, Print-to-PDF documents)', default_display: UNDETERMINED, alt_display: UNDETERMINED}
- {meaning: Not yet reviewed, default_display: PENDING, alt_display: PENDING}
note: Which display set is used depends on the company's result-display setting.
- name: REPORT_UPDATED
fires_when: A previously delivered report changes — income dispute, override, or fraud re-review.
retried: false
extra_object: update
note: Carries an additional top-level `update` object describing why the report changed.
- name: IDV_REPORT_READY
fires_when: An ID verification reaches a terminal status.
retried: false
data_fields:
- {name: idVerificationId, type: uuid}
- {name: status, type: string, values: [PASS, FAIL]}
note: >-
Not tied to an applicant record — applicantId, applicantDetailId, externalId and externalMetadata
are always null. Identity Verification applicants and Fraud Detection applicants do not share ids.
- name: ACCEPTED_DOCUMENT
status: deprecated
fires_when: Snappt finished running basic checks on a document uploaded to an applicant session.
note: >-
Scheduled for removal since v0.9.0; superseded by the synchronous ?checks=true query parameter
on POST /session/documents.
delivery:
content_type: application/json
body_format: compact JSON, no whitespace — the signature is computed over these exact bytes
headers: [Snappt-Signature-v2, 'Snappt-Signature (legacy v1)', 'any custom headers registered on the webhook']
timeout: 30 seconds
success_criteria: HTTP 200 within the timeout
failure_criteria: [non-2xx (including 301/302, which are not followed), connection errors, timeouts]
ordering: not guaranteed — parallel delivery across applicants, and a retry of an older event can arrive after a newer one
security:
signature_header: Snappt-Signature-v2
algorithm: HMAC-SHA256
encoding: base64url
signed_string: '{timestamp}.{rawBody}'
key: webhook signing secret (whsec_ prefix)
timestamp_units: milliseconds
recommended_max_age: 5 minutes
constant_time_comparison: recommended
legacy:
header: Snappt-Signature
key: API Key ID
status: deprecated, will be removed in a future release
consumer_guidance:
idempotency_key: data.id + eventType
advice: >-
Return 2xx as soon as the applicant is matched, then do long-running work; treat duplicate
deliveries as no-ops and still return 200; do not rely on exactly-once delivery.