From 50fd45fc3ce7182e9b1fabb51db7f7ce25f0c543 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 1 Nov 2026 06:47:16 +0000 Subject: [PATCH] chore(spec): sync API spec 2026-11-01 Synced openapi/verification.json and openapi/account.json from the published API contract (docs/DESIGN.md section 3.1). Operations: 14 added, 0 removed, 0 renamed, 0 moved, 370 changed. Regenerated the SDK. BREAKING CHANGE: the API spec sync changes the SDK surface. - `sessions.retrieve_decision` (`GET /v3/session/{sessionId}/decision/`): response 200 `signatures[].confirmation.channel`: can now be null - `sessions.retrieve_decision` (`GET /v3/session/{sessionId}/decision/`): response 200 `registry_checks[].company.registry_data`: can now be null - `sessions.retrieve_decision` (`GET /v3/session/{sessionId}/decision/`): response 200 `registry_checks[].ownership_structure`: can now be null - `email.assess_risk` (`POST /v3/email/risk/`): response 200 `email.email_intelligence.reason_codes[]`: type changed from string to object - `kyb.select` (`POST /v3/kyb/select/`): response 200 `kyb_registry.registry_data`: can now be null - `kyb.list_shareholders` (`POST /v3/kyb/shareholders/`): response 200 `kyb_registry.registry_data`: can now be null - `kyb.list_ubos` (`POST /v3/kyb/ubo/`): response 200 `kyb_registry.registry_data`: can now be null - `phone.assess_risk` (`POST /v3/phone/risk/`): response 200 `phone.phone_intelligence.reason_codes[]`: type changed from string to object - `sessions.import_shared` (`POST /v3/session/import-shared/`): response 201 `signatures[].confirmation.channel`: can now be null - `sessions.import_shared` (`POST /v3/session/import-shared/`): response 201 `registry_checks[].company.registry_data`: can now be null - `sessions.import_shared` (`POST /v3/session/import-shared/`): response 201 `registry_checks[].ownership_structure`: can now be null - `sessions.signatures.validate` (`POST /v3/session/{sessionId}/signatures/{nodeId}/validate/`): response 200 `signatures[].confirmation.channel`: can now be null --- lib/didit/resources/analytics.rb | 29 + lib/didit/resources/bank.rb | 12 +- lib/didit/resources/database_validation.rb | 65 + lib/didit/resources/email.rb | 20 + lib/didit/resources/id_verification.rb | 27 +- lib/didit/resources/id_wallets.rb | 84 + lib/didit/resources/kyb.rb | 21 +- lib/didit/resources/phone.rb | 26 + lib/didit/resources/pricing.rb | 6 +- lib/didit/resources/sessions.rb | 490 +- lib/didit/resources/transactions.rb | 9 +- lib/didit/resources/travel_rule.rb | 96 + lib/didit/resources/users.rb | 31 +- lib/didit/resources/wallet_screening.rb | 11 +- lib/didit/resources/webhooks.rb | 9 +- lib/didit/types.rb | 121 + lib/didit/types/aml.rb | 19 + lib/didit/types/components.rb | 936 +- lib/didit/types/email.rb | 28 + lib/didit/types/kyb.rb | 85 +- lib/didit/types/phone.rb | 38 + lib/didit/types/sessions.rb | 481 +- lib/didit/types/travel_rule.rb | 7 + lib/didit/types/wallet_screening.rb | 19 +- openapi/SOURCE.json | 8 +- openapi/account.json | 295 +- openapi/verification.json | 31497 ++++++++++++++---- sig/didit/resources/analytics.rbs | 1 + sig/didit/resources/database_validation.rbs | 2 +- sig/didit/resources/email.rbs | 2 +- sig/didit/resources/id_wallets.rbs | 2 + sig/didit/resources/phone.rbs | 2 +- sig/didit/resources/sessions.rbs | 19 +- sig/didit/resources/transactions.rbs | 2 +- sig/didit/resources/travel_rule.rbs | 5 + sig/didit/resources/users.rbs | 2 +- sig/didit/resources/wallet_screening.rbs | 2 +- sig/didit/resources/webhooks.rbs | 2 +- sig/didit/types/aml.rbs | 18 + sig/didit/types/components.rbs | 784 +- sig/didit/types/database_validation.rbs | 2 +- sig/didit/types/email.rbs | 23 +- sig/didit/types/id_wallets.rbs | 4 + sig/didit/types/kyb.rbs | 80 +- sig/didit/types/phone.rbs | 30 +- sig/didit/types/sessions.rbs | 464 +- sig/didit/types/travel_rule.rbs | 9 + sig/didit/types/users.rbs | 2 +- sig/didit/types/wallet_screening.rbs | 6 +- sig/didit/types/webhooks.rbs | 2 +- spec/generated/aml_spec.rb | 12 +- spec/generated/analytics_spec.rb | 90 + spec/generated/businesses_spec.rb | 22 +- spec/generated/cases_spec.rb | 206 +- spec/generated/database_validation_spec.rb | 16 +- spec/generated/fraud_checks_spec.rb | 64 +- spec/generated/id_wallets_spec.rb | 150 + spec/generated/investigator_spec.rb | 29 +- spec/generated/kyb_spec.rb | 87 +- spec/generated/regulatory_reports_spec.rb | 17 +- spec/generated/report_templates_spec.rb | 33 +- spec/generated/sessions_spec.rb | 418 +- spec/generated/travel_rule_spec.rb | 138 +- spec/generated/users_spec.rb | 10 +- spec/generated/wallet_screening_spec.rb | 4 +- spec/generated/workflows_spec.rb | 5 + 66 files changed, 30366 insertions(+), 6870 deletions(-) diff --git a/lib/didit/resources/analytics.rb b/lib/didit/resources/analytics.rb index b1eabf7..a47f084 100644 --- a/lib/didit/resources/analytics.rb +++ b/lib/didit/resources/analytics.rb @@ -82,6 +82,35 @@ def retrieve( request_options: request_options ) end + + # Get today's verifications by hour + # + # Today's user verification (KYC) sessions, from local midnight in `tz`, counted per local hour they were + # created in, next to the same hours of the same weekday one week before, and split by the outcome each one + # holds now: approved, in review or declined. This is the volume card of the Business Console's Home. + # + # `total` is today so far. `previous_total_so_far` counts the comparison day only up to the same local time, so + # a change between them compares the same part of both days. The hours still to come today are `0`. A day on + # which the clocks change has 23 or 25 hours: the missing hour stays `0` and the repeated hour holds both. + # + # +GET /v3/organization/{organization_id}/application/{application_id}/analytics/today/+ + # + # @param tz [String] IANA time zone whose midnight starts today, for example `Europe/Madrid` or + # `America/Mexico_City`. Omit it for UTC. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::ApplicationAnalyticsToday] + def retrieve_today(tz: OMIT, request_options: nil) + @client.request( + :get, + "/v3/organization/{organization_id}/application/{application_id}/analytics/today/", + query: { + "tz" => tz + }, + scope: :application, + response: Types::ApplicationAnalyticsToday, + request_options: request_options + ) + end end end end diff --git a/lib/didit/resources/bank.rb b/lib/didit/resources/bank.rb index ab2a37c..b2f58b9 100644 --- a/lib/didit/resources/bank.rb +++ b/lib/didit/resources/bank.rb @@ -7,6 +7,10 @@ module Resources class Bank < Didit::Resource # Check a bank account # + # **Not available in production yet.** Bank Verification is switched off in production, so until it is switched + # on this endpoint answers `404` with `bank_verification_not_available`. Do not build on it yet. The rest of + # this description is what the endpoint does once it is available. + # # Check that a bank account belongs to the person or company you name, before you send money to it. No session # and no sign-in: send the name and the account, read the result. It is the [account # check](/core-technology/bank-verification/account-check) of the Bank Verification step, run from your backend. @@ -26,10 +30,10 @@ class Bank < Didit::Resource # **Every request is a new check.** There is no idempotency key and no endpoint to read a check back, so a # retried request runs, and is billed, again. Store the response. # - # **Sandbox.** A sandbox key calls no bank and is charged nothing. The last 4 characters of the IBAN, else of - # the account number, choose the answer: `0001` a `close_match` with a `holder_name`, `0002` a `close_match` - # without one, `0003` and `0006` a `no_match`, `0004` `cannot_verify`, `0005` a `503` and `0009` a `400`. Any - # other ending is a `match`. + # **Sandbox.** Where Bank Verification is available, a sandbox key calls no bank and is charged nothing. The + # last 4 characters of the IBAN, else of the account number, choose the answer: `0001` a `close_match` with a + # `holder_name`, `0002` a `close_match` without one, `0003` and `0006` a `no_match`, `0004` `cannot_verify`, + # `0005` a `503` and `0009` a `400`. Any other ending is a `match`. # # **API keys.** A scoped API key needs write access to sessions. # diff --git a/lib/didit/resources/database_validation.rb b/lib/didit/resources/database_validation.rb index 86345f5..f2adde5 100644 --- a/lib/didit/resources/database_validation.rb +++ b/lib/didit/resources/database_validation.rb @@ -156,6 +156,39 @@ class DatabaseValidation < Didit::Resource # (A/B/C) in `mex_ine_vigencia`. # @param bvn [String] Nigerian Bank Verification Number. # @param bank_card_number [String] Bank card number (CHN bank-card verification). + # @param company_registration_number [String] Company registration number as issued by the companies register: + # the CNPJ in Brazil (e.g. `11222333000181`), the registration number in South Africa (e.g. `1936/007721/06`). + # Required by the company registry and company directors services (`bra_company_registry`, + # `bra_company_directors`, `zaf_company_registry`, `zaf_company_directors`). + # @param company_name [String] Registered company name, cross-checked against the register entry. Optional for + # `zaf_company_registry`. + # @param initials [String] The person's initials as printed on the document. Required by `zaf_drivers_license`; + # accepted by `zaf_bank_account_holder`. + # @param licence_number [String] Driving licence number as printed on the card, for `zaf_drivers_license`. When + # omitted, `document_number` is used. + # @param refugee_file_number [String] Refugee file number issued by South Africa's Department of Home Affairs. + # Required by `zaf_refugee`. + # @param bank_name [String] Name of the bank that holds the account. Required by `zaf_bank_account_holder`. + # @param bank_account_number [String] Bank account number. Required by `zaf_bank_account_holder`; accepted by + # `zaf_fraud_prevention`. + # @param account_type [String] Bank account type for `zaf_bank_account_holder`: `current`, `savings`, + # `transmission`, `subscriptionShare` or `notKnown`, case-insensitive. Any other value returns `400`. Omit it + # when you do not know the type: the account-type cross-check is then reported as not confirmed. + # @param phone_number [String] Contact mobile number, for the services that cross-check contactability + # (`zaf_bank_account_holder`, `zaf_fraud_prevention`, `zaf_refugee`). + # @param right_thumb [String] Base64-encoded right thumb fingerprint for `zaf_dha_fingerprint_match`, with + # `left_thumb` or on its own. + # @param left_thumb [String] Base64-encoded left thumb fingerprint for `zaf_dha_fingerprint_match`, with + # `right_thumb` or on its own. + # @param score_level [Integer] Minimum biometric score level for `zaf_criminal_face_screening`. Defaults to `3`. + # @param max_matches [Integer] Maximum number of candidate matches `zaf_criminal_face_screening` returns. + # Defaults to `1`. + # @param vehicle_register_number [String] Vehicle register number. Required, with `vehicle_licence_plate` and + # `vin`, by `zaf_vehicle_ownership`. + # @param vehicle_licence_plate [String] Vehicle licence plate number. Required, with `vehicle_register_number` + # and `vin`, by `zaf_vehicle_ownership`. + # @param vin [String] Vehicle Identification Number (VIN or chassis number). Required, with + # `vehicle_register_number` and `vehicle_licence_plate`, by `zaf_vehicle_ownership`. # @param ssn [String] Social Security Number (USA). # @param phone [String] Phone number for phone-verification services. # @param landline [String] Landline number for phone-verification services. @@ -232,6 +265,22 @@ def validate( emission_number: OMIT, bvn: OMIT, bank_card_number: OMIT, + company_registration_number: OMIT, + company_name: OMIT, + initials: OMIT, + licence_number: OMIT, + refugee_file_number: OMIT, + bank_name: OMIT, + bank_account_number: OMIT, + account_type: OMIT, + phone_number: OMIT, + right_thumb: OMIT, + left_thumb: OMIT, + score_level: OMIT, + max_matches: OMIT, + vehicle_register_number: OMIT, + vehicle_licence_plate: OMIT, + vin: OMIT, ssn: OMIT, phone: OMIT, landline: OMIT, @@ -304,6 +353,22 @@ def validate( "emission_number" => emission_number, "bvn" => bvn, "bank_card_number" => bank_card_number, + "company_registration_number" => company_registration_number, + "company_name" => company_name, + "initials" => initials, + "licence_number" => licence_number, + "refugee_file_number" => refugee_file_number, + "bank_name" => bank_name, + "bank_account_number" => bank_account_number, + "account_type" => account_type, + "phone_number" => phone_number, + "right_thumb" => right_thumb, + "left_thumb" => left_thumb, + "score_level" => score_level, + "max_matches" => max_matches, + "vehicle_register_number" => vehicle_register_number, + "vehicle_licence_plate" => vehicle_licence_plate, + "vin" => vin, "ssn" => ssn, "phone" => phone, "landline" => landline, diff --git a/lib/didit/resources/email.rb b/lib/didit/resources/email.rb index 5d246e0..551dc9c 100644 --- a/lib/didit/resources/email.rb +++ b/lib/didit/resources/email.rb @@ -143,6 +143,18 @@ def assess_risk( # @param disposable_email_action [String] What to do when the domain belongs to a disposable/temporary-mail # provider (`email.is_disposable`). `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the # risk in `email.warnings`. + # @param enable_enrichment [Boolean] When `true`, also run email intelligence on the address: a risk score and + # its breach history. Billed as one `email_intelligence_api` unit per request ($0.05 at list price) in addition + # to this endpoint's own price. The request returns `403` when your balance cannot cover it. + # @param email_intelligence_score_action [String] Action when the email intelligence risk score is above the + # threshold. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. + # Only takes effect when `enable_enrichment` is `true`. + # @param recent_email_breach_action [String] Action when the address appears in a recent known data breach. + # `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes + # effect when `enable_enrichment` is `true`. + # @param frequent_email_breach_action [String] Action when the address appears in many known data breaches. + # `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes + # effect when `enable_enrichment` is `true`. # @param enable_social [Boolean] When true, also look up the social footprint of the address - the email, # social, professional, e-commerce and entertainment platforms it is registered on. Billed as one `email_social` # unit per request in addition to this endpoint's own price. @@ -157,6 +169,10 @@ def check_code( duplicated_email_action: OMIT, breached_email_action: OMIT, disposable_email_action: OMIT, + enable_enrichment: OMIT, + email_intelligence_score_action: OMIT, + recent_email_breach_action: OMIT, + frequent_email_breach_action: OMIT, enable_social: OMIT, email_no_social_presence_action: OMIT, request_options: nil @@ -170,6 +186,10 @@ def check_code( "duplicated_email_action" => duplicated_email_action, "breached_email_action" => breached_email_action, "disposable_email_action" => disposable_email_action, + "enable_enrichment" => enable_enrichment, + "email_intelligence_score_action" => email_intelligence_score_action, + "recent_email_breach_action" => recent_email_breach_action, + "frequent_email_breach_action" => frequent_email_breach_action, "enable_social" => enable_social, "email_no_social_presence_action" => email_no_social_presence_action }, diff --git a/lib/didit/resources/id_verification.rb b/lib/didit/resources/id_verification.rb index 2e6d20f..de7fce5 100644 --- a/lib/didit/resources/id_verification.rb +++ b/lib/didit/resources/id_verification.rb @@ -23,19 +23,20 @@ class IdVerification < Didit::Resource # hard-failure risks always decline: `DOCUMENT_EXPIRED`, `SCREEN_CAPTURE_DETECTED`, `PRINTED_COPY_DETECTED`, # `PORTRAIT_MANIPULATION_DETECTED`, `PUBLIC_DOCUMENT_IMAGE_DETECTED`, plus extraction failures # (`NAME_NOT_DETECTED`, `DATE_OF_BIRTH_NOT_DETECTED`, `DOCUMENT_NUMBER_NOT_DETECTED`). - # (`PORTRAIT_IMAGE_NOT_DETECTED`, `COULD_NOT_DETECT_DOCUMENT_TYPE`, `INVALID_DATE`, and `MRZ_NOT_DETECTED` exist - # in workflow sessions but are never produced by this standalone endpoint.) Three risk groups are configurable - # per request via `invalid_mrz_action`, `inconsistent_data_action`, and `expiration_date_not_detected_action` - # (`DECLINE` or `NO_ACTION`). All other warnings (e.g. `POSSIBLE_DUPLICATED_USER`) are informational and never - # decline on their own. When `perform_document_liveness=true` (the default) and the forgery check returns no - # usable score - the provider failed, answered non-200, or answered HTTP 200 with `status="ERR"` - the call - # returns `200` with `status: "In Review"` and a `DOCUMENT_LIVENESS_NOT_COMPUTED` warning (`log_type: - # "warning"`) instead of `Approved`: a check that did not run is not evidence that the document is genuine. This - # escalation is not configurable and never overrides a `Declined`; with `perform_document_liveness=false` the - # check is skipped and the status follows the remaining warnings as before. A document that cannot be processed - # at all returns `400` with `{"error": "COULD_NOT_RECOGNIZE_DOCUMENT"}`; a readable but problematic document - # returns `200` with `status: "Declined"` - always inspect `id_verification.status` and - # `id_verification.warnings`, not just the HTTP code. + # (`PORTRAIT_IMAGE_NOT_DETECTED`, `INVALID_DATE`, and `MRZ_NOT_DETECTED` exist in workflow sessions but are + # never produced by this standalone endpoint. `COULD_NOT_DETECT_DOCUMENT_TYPE` is returned here when the front + # image does not match a known official document design with high confidence, and declines the request.) Three + # risk groups are configurable per request via `invalid_mrz_action`, `inconsistent_data_action`, and + # `expiration_date_not_detected_action` (`DECLINE` or `NO_ACTION`). All other warnings (e.g. + # `POSSIBLE_DUPLICATED_USER`) are informational and never decline on their own. When + # `perform_document_liveness=true` (the default) and the forgery check returns no usable score - the provider + # failed, answered non-200, or answered HTTP 200 with `status="ERR"` - the call returns `200` with `status: "In + # Review"` and a `DOCUMENT_LIVENESS_NOT_COMPUTED` warning (`log_type: "warning"`) instead of `Approved`: a check + # that did not run is not evidence that the document is genuine. This escalation is not configurable and never + # overrides a `Declined`; with `perform_document_liveness=false` the check is skipped and the status follows the + # remaining warnings as before. A document that cannot be processed at all returns `400` with `{"error": + # "COULD_NOT_RECOGNIZE_DOCUMENT"}`; a readable but problematic document returns `200` with `status: "Declined"` + # - always inspect `id_verification.status` and `id_verification.warnings`, not just the HTTP code. # # **Billing.** Each `200` response consumes one ID Verification API credit (paid from your plan credit or top-up # balance). When the organization's balance cannot cover the call, the endpoint returns `403` with the diff --git a/lib/didit/resources/id_wallets.rb b/lib/didit/resources/id_wallets.rb index 26f4664..d41a140 100644 --- a/lib/didit/resources/id_wallets.rb +++ b/lib/didit/resources/id_wallets.rb @@ -757,6 +757,61 @@ def start_ftn( ) end + # Start Google Wallet verification + # + # Start a Google Wallet sign-in (Google Wallet (ID pass) and US state issuers (mobile driving licence); USA, + # GBR, BRA, SGP, TWN) without any workflow. Billed once, only when the identity is verified. The response + # carries next_action.type=request_digital_credential with a request Didit signed for your application, usable + # only from origin. In a user gesture there, pass next_action.digital_credentials.request to + # navigator.credentials.get({digital: ...}) (or to Android Credential Manager as GetDigitalCredentialOption + # requestJson), then POST what the wallet returns to + # /v3/id-verification/wallets/verifications/{request_id}/response/. The browser offers its own QR code when the + # wallet is on another device. Sandbox applications get a deterministic simulation (simulated: true) that never + # contacts the provider. + # + # +POST /v3/id-verification/wallets/google-wallet/+ + # + # @param country [String] ISO 3166-1 alpha-3 country of the Google Wallet identity. * `USA` - USA * `GBR` - GBR + # * `BRA` - BRA * `SGP` - SGP * `TWN` - TWN + # @param origin [String] Where your page or app will ask the wallet: the https origin of your page (its host + # must be in the application's allowed_return_hosts, or be its white-label domain), e.g. + # https://app.example.com, or android:apk-key-hash:. The wallet refuses the request anywhere else. + # @param vendor_data [String, nil] Your own reference for this verification (e.g. your user id). Returned in + # results and webhooks. + # @param metadata [Hash, nil] Optional JSON object stored with the verification and returned in results and + # webhooks. + # @param sandbox_scenario [String] Sandbox applications only: the simulated outcome - 'wallet_cancelled', + # 'wallet_timeout' or 'wallet_provider_error'; any other scenario (or none) verifies. Rejected on live + # applications. The full catalog is available at GET /v1/sandbox/scenarios/. + # @param idempotency_key [String] sent as the Idempotency-Key header + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::DigitalIdWalletApiWalletVerificationResponse] + def start_google_wallet( + country:, + origin:, + vendor_data: OMIT, + metadata: OMIT, + sandbox_scenario: OMIT, + idempotency_key: OMIT, + request_options: nil + ) + @client.request( + :post, + "/v3/id-verification/wallets/google-wallet/", + body: { + "country" => country, + "origin" => origin, + "vendor_data" => vendor_data, + "metadata" => metadata, + "sandbox_scenario" => sandbox_scenario + }, + headers: { "Idempotency-Key" => idempotency_key }, + response: Types::DigitalIdWalletApiWalletVerificationResponse, + request_options: request_options + ) + end + # Start gov.br verification # # Start a gov.br sign-in (Governo Federal do Brasil; BRA) without any workflow. Billed once, only when the @@ -1463,6 +1518,35 @@ def start_vipps( request_options: request_options ) end + + # Submit a wallet response + # + # Digital Credentials API wallets (Google Wallet): send what the wallet returned to your page or app for a + # verification whose next_action is request_digital_credential. Didit decrypts it, checks the issuer's signature + # against the trusted issuer roots, every returned value against its signed digest, and the device signature + # over your origin and this request, then decides the verification: verified (billed once) or declined with the + # error code. Single use: a second submit returns the decided verification. + # + # +POST /v3/id-verification/wallets/verifications/{request_id}/response/+ + # + # @param request_id [String] The request_id the start endpoint returned. + # @param response [Hash] Exactly what the wallet returned: {protocol, data} of the DigitalCredential from + # navigator.credentials.get, or the parsed credentialJson of Android's DigitalCredential. Encrypted to Didit; do + # not alter it. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::DigitalIdWalletApiWalletVerificationResponse] + def submit_verification_response(request_id, response:, request_options: nil) + @client.request( + :post, + "/v3/id-verification/wallets/verifications/{request_id}/response/", + path_params: { "request_id" => request_id }, + body: { + "response" => response + }, + response: Types::DigitalIdWalletApiWalletVerificationResponse, + request_options: request_options + ) + end end end end diff --git a/lib/didit/resources/kyb.rb b/lib/didit/resources/kyb.rb index 7fa17c3..87e6383 100644 --- a/lib/didit/resources/kyb.rb +++ b/lib/didit/resources/kyb.rb @@ -11,8 +11,10 @@ class Kyb < Didit::Resource # ownership bands) of one candidate returned by `POST /v3/kyb/search/`. # # **Pairing with search.** Pass the candidate's `kyb_response_id` exactly as returned by a search of the same - # application. The search runs on the Lite registry chain; when the country's ownership data lives at another - # registry Didit re-finds the company there by registration number, at no extra cost. + # application. Search at the tier you intend to buy (`tier` on `POST /v3/kyb/search/`), because the search runs + # on the registry chain that serves that tier and an empty Lite search is not proof that the registry does not + # hold the company. When the country's ownership data lives at another registry, Didit re-finds the company + # there by registration number, at no extra cost. # # **Billing.** Billed at the country's Shareholders price - see [KYB registry # pricing](/getting-started/kyb-registry-pricing). When the registry holds no shareholder record for the company @@ -32,7 +34,8 @@ class Kyb < Didit::Resource # +POST /v3/kyb/shareholders/+ # # @param kyb_response_id [String] Candidate handle from `POST /v3/kyb/search/` - # (`kyb_registry.companies[].kyb_response_id`). Ephemeral - use it shortly after the search that produced it. + # (`kyb_registry.companies[].kyb_response_id`). Ephemeral: use it shortly after the search that produced it. + # Handles can be long, so store and send the value exactly as returned, without trimming or assuming a length. # @param vendor_data [String] Your identifier for this company; echoed back and stored with the business # session. # @param metadata [Hash, nil] Free-form JSON stored with the business session and echoed back. @@ -68,8 +71,10 @@ def list_shareholders( # by `POST /v3/kyb/search/`. # # **Pairing with search.** Pass the candidate's `kyb_response_id` exactly as returned by a search of the same - # application. The search runs on the Lite registry chain; when the country's ownership data lives at another - # registry Didit re-finds the company there by registration number, at no extra cost. + # application. Search at the tier you intend to buy (`tier` on `POST /v3/kyb/search/`), because the search runs + # on the registry chain that serves that tier and an empty Lite search is not proof that the registry does not + # hold the company. When the country's ownership data lives at another registry, Didit re-finds the company + # there by registration number, at no extra cost. # # **Billing.** Billed at the country's UBO price - see [KYB registry # pricing](/getting-started/kyb-registry-pricing). The tier delivered is the highest the country and the @@ -89,7 +94,8 @@ def list_shareholders( # +POST /v3/kyb/ubo/+ # # @param kyb_response_id [String] Candidate handle from `POST /v3/kyb/search/` - # (`kyb_registry.companies[].kyb_response_id`). Ephemeral - use it shortly after the search that produced it. + # (`kyb_registry.companies[].kyb_response_id`). Ephemeral: use it shortly after the search that produced it. + # Handles can be long, so store and send the value exactly as returned, without trimming or assuming a length. # @param vendor_data [String] Your identifier for this company; echoed back and stored with the business # session. # @param metadata [Hash, nil] Free-form JSON stored with the business session and echoed back. @@ -229,7 +235,8 @@ def search( # +POST /v3/kyb/select/+ # # @param kyb_response_id [String] Candidate handle from `POST /v3/kyb/search/` - # (`kyb_registry.companies[].kyb_response_id`). Ephemeral - use it shortly after the search that produced it. + # (`kyb_registry.companies[].kyb_response_id`). Ephemeral: use it shortly after the search that produced it. + # Handles can be long, so store and send the value exactly as returned, without trimming or assuming a length. # @param vendor_data [String] Your identifier for this company; echoed back and stored with the business # session. # @param metadata [Hash, nil] Free-form JSON stored with the business session and echoed back. diff --git a/lib/didit/resources/phone.rb b/lib/didit/resources/phone.rb index 2fcedf9..df8840f 100644 --- a/lib/didit/resources/phone.rb +++ b/lib/didit/resources/phone.rb @@ -143,6 +143,22 @@ def assess_risk( # @param voip_number_action [String] What to do when the carrier lookup reports a virtual line type - `voip`, # `isp`, or `vpn` (`phone.is_virtual`). `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records # the risk in `phone.warnings`. + # @param enable_enrichment [Boolean] When `true`, also run phone intelligence on the number: a risk score, the + # line type, whether it was recently ported and a trust index. Billed as one `phone_intelligence_api` unit per + # request ($0.05 at list price) in addition to this endpoint's own price. The request returns `403` when your + # balance cannot cover it. + # @param phone_intelligence_score_action [String] Action when the phone intelligence risk score is above the + # threshold. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. + # Only takes effect when `enable_enrichment` is `true`. + # @param phone_type_risk_action [String] Action when the number is a high-risk line type. `DECLINE` flips the + # final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when + # `enable_enrichment` is `true`. + # @param recent_port_action [String] Action when the number was ported to another carrier recently. `DECLINE` + # flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes effect + # when `enable_enrichment` is `true`. + # @param low_phone_trust_action [String] Action when the phone intelligence trust index is at or below the + # threshold. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. + # Only takes effect when `enable_enrichment` is `true`. # @param enable_social [Boolean] When true, also look up the social footprint of the number - the messaging, # social, e-commerce and professional platforms it is registered on. Billed as one `phone_social` unit per # request in addition to this endpoint's own price. @@ -157,6 +173,11 @@ def check_code( duplicated_phone_number_action: OMIT, disposable_number_action: OMIT, voip_number_action: OMIT, + enable_enrichment: OMIT, + phone_intelligence_score_action: OMIT, + phone_type_risk_action: OMIT, + recent_port_action: OMIT, + low_phone_trust_action: OMIT, enable_social: OMIT, phone_no_social_presence_action: OMIT, request_options: nil @@ -170,6 +191,11 @@ def check_code( "duplicated_phone_number_action" => duplicated_phone_number_action, "disposable_number_action" => disposable_number_action, "voip_number_action" => voip_number_action, + "enable_enrichment" => enable_enrichment, + "phone_intelligence_score_action" => phone_intelligence_score_action, + "phone_type_risk_action" => phone_type_risk_action, + "recent_port_action" => recent_port_action, + "low_phone_trust_action" => low_phone_trust_action, "enable_social" => enable_social, "phone_no_social_presence_action" => phone_no_social_presence_action }, diff --git a/lib/didit/resources/pricing.rb b/lib/didit/resources/pricing.rb index aab8d00..3f519eb 100644 --- a/lib/didit/resources/pricing.rb +++ b/lib/didit/resources/pricing.rb @@ -8,8 +8,10 @@ class Pricing < Didit::Resource # Get bank verification prices (public, unauthenticated) # # Returns the list price of each Bank Verification method in every country: bank sign-in with its balance and - # transactions add-ons, and the account check. Use it to quote a bank step before you build a workflow, or to - # show bank prices in your own product. + # transactions add-ons, and the account check. Bank Verification is not enabled in production yet, so a bank + # step is refused on production workflows until it is; treat these prices as a list price, not as an offer you + # can buy today. Use it to quote a bank step before you build a workflow, or to show bank prices in your own + # product. # # Public: send no auth header. The response contains no organization data and is the same for every caller. It # is cached publicly for one hour and carries an `ETag`, so send `If-None-Match` to get a `304 Not Modified` diff --git a/lib/didit/resources/sessions.rb b/lib/didit/resources/sessions.rb index 2930524..01c555e 100644 --- a/lib/didit/resources/sessions.rb +++ b/lib/didit/resources/sessions.rb @@ -414,6 +414,11 @@ def cancel_feature_override(session_id, override_id, request_options: nil) # linked to the same user profile in the Users tab. (2) **Cross-session duplicate detection** - when checking # for duplicated faces, documents, phone numbers, emails, IP addresses, or device fingerprints, sessions with # the... + # @param multi_account_segment [String] Optional duplicate-detection realm inside your organization. Duplicate + # face checks compare this session only with other sessions that carry the same segment, so separate account + # bases (personal and business accounts, or one per B2B sub-client) do not flag a person who legitimately holds + # one account in each. Omit it to use the single default realm, which is what every session uses today. + # Blocklist... # @param callback [String] URL to redirect the user to after verification completes. Didit automatically appends # `verificationSessionId` and `status` (Approved, Declined, In Review) as query parameters. Custom URL schemes # (e.g. `myapp://`) are supported for mobile callbacks. If omitted, the workflow's default `callback_url` is @@ -449,10 +454,10 @@ def cancel_feature_override(session_id, override_id, request_options: nil) # bundled magic values onto the session's input fields (contact_details, expected_details) so the mocked # providers reproduce the scenario's outcome through the real workflow pipeline. See the scenario catalog at GET # /v1/san... - # @param sign [Hash] Electronic Signature input for this session. `documents` are the documents to sign, for a - # workflow whose Electronic Signature step takes documents from the session (`signature_documents_source` - # `session` or `both`): up to 20 documents and 50 MB in total. `field_values` fills the fields whose `prefill` - # is `api.`, on workflow and session documents alike. Creating a session again for the same `... + # @param sign [Hash] E-signature input for this session. `documents` are the documents to sign, for a workflow + # whose E-signature step takes documents from the session (`signature_documents_source` `session` or `both`): up + # to 20 documents and 50 MB in total. `field_values` fills the fields whose `prefill` is `api.`, on + # workflow and session documents alike. Creating a session again for the same `workflow_id` and `... # @param user_state [String] Where the person lives, when you know it: an ISO 3166-2 subdivision code (`US-IL`, # `ES-M`) or a US state code or name (`IL`, `Illinois`). A state whose law requires explicit biometric consent # (Illinois, Texas, Colorado) makes the verification flow ask for it before capturing a face, with trigger @@ -466,6 +471,7 @@ def cancel_feature_override(session_id, override_id, request_options: nil) def create( workflow_id:, vendor_data: OMIT, + multi_account_segment: OMIT, callback: OMIT, callback_method: OMIT, metadata: OMIT, @@ -486,6 +492,7 @@ def create( body: { "workflow_id" => workflow_id, "vendor_data" => vendor_data, + "multi_account_segment" => multi_account_segment, "callback" => callback, "callback_method" => callback_method, "metadata" => metadata, @@ -504,6 +511,92 @@ def create( ) end + # Create a KYB party draft + # + # Add a party (a person or a company) to the list you are preparing for this KYB session. The same fields and + # rules as the hosted Key People screen apply: a person needs `full_name` or `first_name` and `last_name`, at + # least one role and a nationality; a company needs `company_name` and the country of incorporation in + # `nationality`. Nothing is declared or billed until `POST /v3/session/{sessionId}/kyb/parties/submit/`. + # Requires `write:businesses`. + # + # +POST /v3/session/{sessionId}/kyb/parties/drafts/+ + # + # @param session_id [String] UUID of the Business Verification (KYB) session. It must belong to the application + # of the API key. + # @param entity_type [String] Whether the party is an individual or a company. + # @param nationality [String] Nationality of a person, or country of incorporation of a company. Required for + # every party. + # @param full_name [String] Full name of a person. Send it, or `first_name` and `last_name`. + # @param first_name [String] + # @param last_name [String] + # @param role [String] Role the party holds. Interchangeable with `roles`; when both are sent they are merged. + # @param roles [Array] Every role the party holds. A person needs at least one role (here or in `role`). + # @param position [String] Job title of a person. + # @param date_of_birth [Date, String, nil] + # @param company_name [String] Name of a company party. Required when `entity_type` is `company`. + # @param registration_number [String] Registration number of a company party. + # @param email [String] Where the verification link is sent. Required when the party has to complete + # verification, which depends on the role settings and ownership thresholds of the workflow. + # @param ownership_percent [Numeric, nil] Share of the company the party owns. + # @param phone_number [String] + # @param custom_fields [Hash] Workflow-defined extra fields. + # @param skip_verification [Boolean] Ask to skip this party's verification. Honoured only when the party's role + # allows skipping in the workflow's Key People settings. + # @param node_id [String] Workflow node of the KYB step. Only needed when the workflow has more than one KYB + # node; by default Didit uses the session's own node. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::SessionsCreateKybPartyDraftResponse] + def create_kyb_party_draft( + session_id, + entity_type:, + nationality:, + full_name: OMIT, + first_name: OMIT, + last_name: OMIT, + role: OMIT, + roles: OMIT, + position: OMIT, + date_of_birth: OMIT, + company_name: OMIT, + registration_number: OMIT, + email: OMIT, + ownership_percent: OMIT, + phone_number: OMIT, + custom_fields: OMIT, + skip_verification: OMIT, + node_id: OMIT, + request_options: nil + ) + @client.request( + :post, + "/v3/session/{sessionId}/kyb/parties/drafts/", + path_params: { "sessionId" => session_id }, + query: { + "node_id" => node_id + }, + body: { + "entity_type" => entity_type, + "nationality" => nationality, + "full_name" => full_name, + "first_name" => first_name, + "last_name" => last_name, + "role" => role, + "roles" => roles, + "position" => position, + "date_of_birth" => date_of_birth, + "company_name" => company_name, + "registration_number" => registration_number, + "email" => email, + "ownership_percent" => ownership_percent, + "phone_number" => phone_number, + "custom_fields" => custom_fields, + "skip_verification" => skip_verification + }, + response: Types::SessionsCreateKybPartyDraftResponse, + request_options: request_options + ) + end + # Delete a verification session (KYC or KYB) # # Delete a single verification session, User Verification (KYC) or Business Verification (KYB), by its @@ -517,9 +610,9 @@ def create( # - All stored files owned by the session: document front/back photos (full, cropped, and privacy-blurred # variants), document-capture videos, portrait crops, NFC chip portrait and signature images, face reference # images, liveness videos, face-match source/target images, Proof of Address documents, and any extra uploaded - # files (KYC); uploaded company documents and extra files (KYB). Electronic Signature documents, signed PDFs, - # evidence PDFs and signature images (KYC and KYB): their download paths stop working. Previously issued media - # URLs (`https:///...`) stop resolving. + # files (KYC); uploaded company documents and extra files (KYB). E-signature documents, signed PDFs, evidence + # PDFs and signature images (KYC and KYB): their download paths stop working. Previously issued media URLs + # (`https:///...`) stop resolving. # - The session's face data. Its face embedding is deleted too, unless you choose to keep an image-free template # (see **Face biometric data**). # - Webhook deliveries still queued for the session, and their retries. Webhooks already delivered are not @@ -628,15 +721,40 @@ def delete( ) end + # Delete a KYB party draft + # + # Drop one party draft. Declared parties are not affected. Requires `write:businesses`. + # + # +DELETE /v3/session/{sessionId}/kyb/parties/drafts/{draftId}/+ + # + # @param session_id [String] UUID of the Business Verification (KYB) session. It must belong to the application + # of the API key. + # @param draft_id [String] UUID of the party draft (`draft_id` returned when it was created). + # @param node_id [String] Workflow node of the KYB step. Only needed when the workflow has more than one KYB + # node; by default Didit uses the session's own node. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [nil] + def delete_kyb_party_draft(session_id, draft_id, node_id: OMIT, request_options: nil) + @client.request( + :delete, + "/v3/session/{sessionId}/kyb/parties/drafts/{draftId}/", + path_params: { "sessionId" => session_id, "draftId" => draft_id }, + query: { + "node_id" => node_id + }, + request_options: request_options + ) + end + # Export AML screening history as CSV # # Download the same ongoing-monitoring history as `GET /v3/session/{sessionId}/aml-screening-history/` as a CSV # file, one line per completed re-screen, newest first, ready to hand to an auditor. The file is streamed whole # (no pagination) and starts with a header line; an empty cell means unknown, dataset dates are never estimated, # and a value that would start a spreadsheet formula is prefixed with an apostrophe. Works for KYC and KYB - # session IDs; pass `node_id` when the session ran more than one AML step. Errors are returned as JSON, not CSV. - # A scoped API key needs `decisions: read` and `media: read`: the response is a file, so a key without `media: - # read` gets `403`. + # session IDs; pass `node_id` when the session ran more than one AML step. Pass `month` to export one calendar + # month. Errors are returned as JSON, not CSV. A scoped API key needs `decisions: read` and `media: read`: the + # response is a file, so a key without `media: read` gets `403`. # # +GET /v3/session/{sessionId}/aml-screening-history/export/+ # @@ -646,15 +764,18 @@ def delete( # route and returns an HTML `404`. # @param node_id [String] Workflow graph node ID of the AML check. Needed only when the session ran more than # one AML step; without it the most recent AML check is used. An unknown node returns `404`. + # @param month [String] A UTC calendar month as `YYYY-MM`. Only screenings completed in that month are returned; + # without it every month is returned. A malformed month returns `400`. # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body # @return [String, nil] the body bytes, or nil when a block receives the chunks - def export_aml_screening_history(session_id, node_id: OMIT, request_options: nil, &block) + def export_aml_screening_history(session_id, node_id: OMIT, month: OMIT, request_options: nil, &block) @client.request( :get, "/v3/session/{sessionId}/aml-screening-history/export/", path_params: { "sessionId" => session_id }, query: { - "node_id" => node_id + "node_id" => node_id, + "month" => month }, response: :binary, accept: "text/csv, application/json", @@ -662,6 +783,35 @@ def export_aml_screening_history(session_id, node_id: OMIT, request_options: nil ) end + # Export every file of a session + # + # Start preparing one ZIP with every image, video and document of a User Verification (KYC) or Business + # Verification (KYB) session, in original quality: the files are stored in the ZIP as they were captured, never + # recompressed. Answers `202` with the export; read it with `GET + # /v3/session/{sessionId}/files-export/{exportId}/` until `status` is `READY`, then download `download_url`. + # While an export of the same session is still being prepared, that export is returned instead of a new one. + # + # The ZIP is deleted 24 hours after it is ready, and at once when the session is deleted. A deleted session + # cannot be exported. Every export and every download link handed out is written to the session's audit log. A + # scoped API key needs `media: read` and `decisions: read`; a console user needs the privilege to read sessions. + # + # +POST /v3/session/{sessionId}/files-export/+ + # + # @param session_id [String] UUID of the verification session (the `session_id` returned by `POST + # /v3/session/`). Accepts both User Verification (KYC) and Business Verification (KYB) session IDs. A deleted + # session returns `404`. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::SessionFilesExport] + def export_files(session_id, request_options: nil) + @client.request( + :post, + "/v3/session/{sessionId}/files-export/", + path_params: { "sessionId" => session_id }, + response: Types::SessionFilesExport, + request_options: request_options + ) + end + # Download a PDF report for a verification session # # Render and download a compliance-ready PDF report for a finished verification session. The same path serves @@ -726,6 +876,31 @@ def generate_pdf(session_id, request_options: nil, &block) ) end + # Get a session files export + # + # Progress of an export started with `POST /v3/session/{sessionId}/files-export/`. Once `status` is `READY`, + # `download_url` is a signed URL of the ZIP that stays valid for a short time; read the export again for a new + # one until `expires_at`. Each read that hands out a download link is written to the session's audit log. An + # export of a deleted session returns `404`. + # + # +GET /v3/session/{sessionId}/files-export/{exportId}/+ + # + # @param session_id [String] UUID of the verification session (the `session_id` returned by `POST + # /v3/session/`). Accepts both User Verification (KYC) and Business Verification (KYB) session IDs. A deleted + # session returns `404`. + # @param export_id [String] The `export_id` returned by `POST /v3/session/{sessionId}/files-export/`. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::SessionFilesExport] + def get_files_export(session_id, export_id, request_options: nil) + @client.request( + :get, + "/v3/session/{sessionId}/files-export/{exportId}/", + path_params: { "sessionId" => session_id, "exportId" => export_id }, + response: Types::SessionFilesExport, + request_options: request_options + ) + end + # Redeem a share token to clone a verification session into your application # # Redeem a share token to clone a KYC or KYB session into the calling application with a fresh `session_id`. Not @@ -830,6 +1005,12 @@ def import_shared(share_token:, trust_review:, workflow_id:, vendor_data: OMIT, # @param date_to [Date, String] Only sessions created up to this date (UTC), format `YYYY-MM-DD`. For KYC rows # the entire day is included; for KYB rows the comparison is `created_at <= date_to` (midnight), so use the next # day's date to include a full day of KYB sessions. + # @param tags [String] Comma-separated tag ids (`tags` of your application). Returns the sessions that carry any + # of them. Ids that are not valid UUIDs are ignored, and when none is valid the list is empty. + # @param decided_from [Time, String] ISO 8601 datetime. Returns the sessions whose status last changed at or + # after it. It filters on the time of the last status change, not on creation time. + # @param decided_to [Time, String] ISO 8601 datetime. Returns the sessions whose status last changed before it. + # Combine with `decided_from` for a half-open window. # @param country [String] Comma-separated country filter. For KYC rows: ISO 3166-1 alpha-3 codes of the ID # document's issuing state (e.g. `ESP,USA`), which may differ from nationality. For KYB rows: the registry # company's country code. @@ -877,6 +1058,9 @@ def list( workflow_id: OMIT, date_from: OMIT, date_to: OMIT, + tags: OMIT, + decided_from: OMIT, + decided_to: OMIT, country: OMIT, document_type: OMIT, document_name: OMIT, @@ -905,6 +1089,9 @@ def list( "workflow_id" => workflow_id, "date_from" => date_from, "date_to" => date_to, + "tags" => tags, + "decided_from" => decided_from, + "decided_to" => decided_to, "country" => country, "document_type" => document_type, "document_name" => document_name, @@ -932,8 +1119,8 @@ def list( # IDs; pass `node_id` when the session ran more than one AML step. Only ongoing-monitoring re-screens are listed # (the first screening is part of the session decision) and runs from before this history existed are not # reconstructed, so a session without ongoing monitoring returns an empty list. `count` is exact up to 100 and - # capped at 100 above that, so follow `next` until it is `null`. A scoped API key needs `decisions: read`; see - # [Continuous AML + # capped at 100 above that, so follow `next` until it is `null`. Pass `month` to read one calendar month at a + # time. A scoped API key needs `decisions: read`; see [Continuous AML # monitoring](https://docs.didit.me/core-technology/aml-screening/continuous-monitoring-aml-screening). # # +GET /v3/session/{sessionId}/aml-screening-history/+ @@ -944,6 +1131,8 @@ def list( # route and returns an HTML `404`. # @param node_id [String] Workflow graph node ID of the AML check. Needed only when the session ran more than # one AML step; without it the most recent AML check is used. An unknown node returns `404`. + # @param month [String] A UTC calendar month as `YYYY-MM`. Only screenings completed in that month are returned; + # without it every month is returned. A malformed month returns `400`. # @param limit [Integer] Maximum number of screening runs per page. Defaults to 50. A value below 1 or a # non-numeric value falls back to 50; a value above 1,000,000 returns `400`. # @param offset [Integer] Number of results to skip before the first returned one. Defaults to 0; a negative or @@ -957,6 +1146,7 @@ def list( def list_aml_screening_history( session_id, node_id: OMIT, + month: OMIT, limit: OMIT, offset: OMIT, ordering: OMIT, @@ -968,6 +1158,7 @@ def list_aml_screening_history( path_params: { "sessionId" => session_id }, query: { "node_id" => node_id, + "month" => month, "limit" => limit, "offset" => offset, "ordering" => ordering @@ -1047,6 +1238,63 @@ def list_feature_overrides(session_id, request_options: nil) ) end + # List the parties named by the uploaded documents + # + # Return the shareholders and directors that the documents uploaded to this KYB session name, merged per person + # and attributed to the documents that named them. Show them to your applicant to confirm, then declare them + # with the party draft endpoints. A range stays a range: `ownership_percent.text` keeps the verbatim figure and + # `min` / `max` the numbers read from it. Nobody is labelled a UBO here; that is decided when the parties are + # submitted, from the role settings and ownership thresholds of the workflow. The same list is in the session + # decision as `document_verifications[].extracted_parties`. Requires `read:businesses` or `read:sessions`. + # + # +GET /v3/session/{sessionId}/kyb/extracted-parties/+ + # + # @param session_id [String] UUID of the Business Verification (KYB) session. It must belong to the application + # of the API key. + # @param node_id [String] Workflow node of the KYB step. Only needed when the workflow has more than one KYB + # node; by default Didit uses the session's own node. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::SessionsListKybExtractedPartiesResponse] + def list_kyb_extracted_parties(session_id, node_id: OMIT, request_options: nil) + @client.request( + :get, + "/v3/session/{sessionId}/kyb/extracted-parties/", + path_params: { "sessionId" => session_id }, + query: { + "node_id" => node_id + }, + response: Types::SessionsListKybExtractedPartiesResponse, + request_options: request_options + ) + end + + # List the KYB party drafts + # + # List the parties you are preparing for this KYB session, oldest first. A draft is not a declared party: it + # does not appear in the decision or the console and creates no verification session until you submit it with + # `POST /v3/session/{sessionId}/kyb/parties/submit/`. Requires `write:businesses`. + # + # +GET /v3/session/{sessionId}/kyb/parties/drafts/+ + # + # @param session_id [String] UUID of the Business Verification (KYB) session. It must belong to the application + # of the API key. + # @param node_id [String] Workflow node of the KYB step. Only needed when the workflow has more than one KYB + # node; by default Didit uses the session's own node. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::SessionsListKybPartyDraftsResponse] + def list_kyb_party_drafts(session_id, node_id: OMIT, request_options: nil) + @client.request( + :get, + "/v3/session/{sessionId}/kyb/parties/drafts/", + path_params: { "sessionId" => session_id }, + query: { + "node_id" => node_id + }, + response: Types::SessionsListKybPartyDraftsResponse, + request_options: request_options + ) + end + # List networks for a session # # List the networks the session's vendor user belongs to. Resolves through the session's vendor_data-linked @@ -1225,8 +1473,8 @@ def regenerate_kyb_party(session_id, party_uuid, request_options: nil) # `ip_analyses`, `database_validations`, `questionnaire_responses`) is a JSON array whose items each carry a # `node_id` identifying the workflow graph node that produced them. Read NFC as `response.nfc_verifications[0]` # - never as a singular `nfc` field. A block is `null` until the workflow has run that feature at least once; - # features the workflow does not include never appear with data. Electronic Signature results are in - # `signatures`, which is present only when the workflow has an Electronic Signature step. + # features the workflow does not include never appear with data. E-signature results are in `signatures`, which + # is present only when the workflow has an E-signature step. # # **When to call.** The recommended pattern is event-driven: wait for the `status.updated` webhook that fires # when the session reaches a decision (`Approved`, `Declined`, `In Review`), then call this endpoint once to @@ -1401,11 +1649,47 @@ def simulate( ) end + # Submit the KYB party drafts + # + # Declare the stored drafts as the company's key people. This is the hosted Key People step under your API key: + # Didit decides from the role settings and ownership thresholds of the workflow which parties must be verified, + # creates one individual KYC session (or a KYB sub-session for a corporate owner) for each of them, sends the + # emails the workflow asks for, and advances the session. Each child session is billed like in the hosted flow. + # The drafts are consumed. Repeating the call after a successful submit changes nothing and answers `200` with + # `already_submitted: true` and the parties that already exist. The session must be on the Key People step. Send + # each person's `kyc_session_url` to them, or embed it. Requires `write:businesses`. + # + # +POST /v3/session/{sessionId}/kyb/parties/submit/+ + # + # @param session_id [String] UUID of the Business Verification (KYB) session. It must belong to the application + # of the API key. + # @param locale [String] Locale used to translate the response of the step the session advances to. + # @param node_id [String] Workflow node of the KYB step. Only needed when the workflow has more than one KYB + # node; by default Didit uses the session's own node. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::SessionsSubmitKybPartiesResponse] + def submit_kyb_parties(session_id, locale: OMIT, node_id: OMIT, request_options: nil) + @client.request( + :post, + "/v3/session/{sessionId}/kyb/parties/submit/", + path_params: { "sessionId" => session_id }, + query: { + "node_id" => node_id + }, + body: { + "locale" => locale + }, + response: Types::SessionsSubmitKybPartiesResponse, + request_options: request_options + ) + end + # Update an AML hit review status # # Set the review status of a **single AML hit** (a potential sanction / PEP / watchlist / adverse-media match) # returned by AML screening, without changing the overall session decision. Identify the hit by its `hit_id` - # (the `id` of an entry in the AML check's `hits` array - see the session decision). + # (the `id` of an entry in the AML check's `hits` array - see the session decision). A hit id returned in the + # earlier format is still accepted; the response always names the hit by its current `id`. # # `review_status` is one of `Unreviewed`, `Confirmed Match`, `False Positive`, or `Inconclusive`. Reviewer # decisions are preserved across ongoing-monitoring updates, so a hit you mark `False Positive` stays that way @@ -1422,7 +1706,8 @@ def simulate( # # @param session_id [String] UUID of the verification session. Accepts both user (KYC) and business (KYB) # session IDs - the service resolves the ID across both session types. - # @param hit_id [String] The `id` of the hit in the AML check's `hits` array. + # @param hit_id [String] The `id` of the hit in the AML check's `hits` array (`hit_...`). A hit id returned in + # the earlier format is still accepted. # @param review_status [String] The new review status for the hit. # @param node_id [String] Optional graph node ID. Use it (here or as a query parameter) when the session has # multiple AML checks. @@ -1942,6 +2227,92 @@ def update_kyb_party(session_id, party_uuid, is_skipped:, request_options: nil) ) end + # Edit a KYB party draft + # + # Change fields of one party draft. The edit is merged into the stored draft and the merged party is validated + # as a whole, so an edit that would leave the party incomplete is rejected. Changing `first_name` or `last_name` + # replaces the stored full name. Requires `write:businesses`. + # + # +PATCH /v3/session/{sessionId}/kyb/parties/drafts/{draftId}/+ + # + # @param session_id [String] UUID of the Business Verification (KYB) session. It must belong to the application + # of the API key. + # @param draft_id [String] UUID of the party draft (`draft_id` returned when it was created). + # @param entity_type [String] Whether the party is an individual or a company. + # @param full_name [String] Full name of a person. Send it, or `first_name` and `last_name`. + # @param first_name [String] + # @param last_name [String] + # @param role [String] Role the party holds. Interchangeable with `roles`; when both are sent they are merged. + # @param roles [Array] Every role the party holds. A person needs at least one role (here or in `role`). + # @param position [String] Job title of a person. + # @param date_of_birth [Date, String, nil] + # @param company_name [String] Name of a company party. Required when `entity_type` is `company`. + # @param registration_number [String] Registration number of a company party. + # @param email [String] Where the verification link is sent. Required when the party has to complete + # verification, which depends on the role settings and ownership thresholds of the workflow. + # @param ownership_percent [Numeric, nil] Share of the company the party owns. + # @param nationality [String] Nationality of a person, or country of incorporation of a company. Required for + # every party. + # @param phone_number [String] + # @param custom_fields [Hash] Workflow-defined extra fields. + # @param skip_verification [Boolean] Ask to skip this party's verification. Honoured only when the party's role + # allows skipping in the workflow's Key People settings. + # @param node_id [String] Workflow node of the KYB step. Only needed when the workflow has more than one KYB + # node; by default Didit uses the session's own node. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::SessionsUpdateKybPartyDraftResponse] + def update_kyb_party_draft( + session_id, + draft_id, + entity_type: OMIT, + full_name: OMIT, + first_name: OMIT, + last_name: OMIT, + role: OMIT, + roles: OMIT, + position: OMIT, + date_of_birth: OMIT, + company_name: OMIT, + registration_number: OMIT, + email: OMIT, + ownership_percent: OMIT, + nationality: OMIT, + phone_number: OMIT, + custom_fields: OMIT, + skip_verification: OMIT, + node_id: OMIT, + request_options: nil + ) + @client.request( + :patch, + "/v3/session/{sessionId}/kyb/parties/drafts/{draftId}/", + path_params: { "sessionId" => session_id, "draftId" => draft_id }, + query: { + "node_id" => node_id + }, + body: { + "entity_type" => entity_type, + "full_name" => full_name, + "first_name" => first_name, + "last_name" => last_name, + "role" => role, + "roles" => roles, + "position" => position, + "date_of_birth" => date_of_birth, + "company_name" => company_name, + "registration_number" => registration_number, + "email" => email, + "ownership_percent" => ownership_percent, + "nationality" => nationality, + "phone_number" => phone_number, + "custom_fields" => custom_fields, + "skip_verification" => skip_verification + }, + response: Types::SessionsUpdateKybPartyDraftResponse, + request_options: request_options + ) + end + # Update Proof of Address data extracted from the POA document on a verification session # # Correct the fields extracted from the user's Proof of Address document - utility bill, bank statement, or @@ -2151,6 +2522,59 @@ def update_status( ) end + # Upload KYB documents to a session + # + # Upload one or more corporate documents (articles of incorporation, shareholder register, certificate of + # incorporation, ...) to the KYB Documents step of a Business Verification session, from your own server instead + # of the hosted page. Didit runs the hosted pipeline: compression, OCR, tampering and cross-document checks, + # document grouping, and advances the session when the required document groups are satisfied. The step costs + # one flat fee however many files you send. The session must be open and on the KYB Documents step, and the + # company chosen at the registry step must exist. Read the people the documents name with `GET + # /v3/session/{sessionId}/kyb/extracted-parties/`. Requires `write:businesses`. + # + # +POST /v3/session/{sessionId}/kyb/documents/+ + # + # @param session_id [String] UUID of the Business Verification (KYB) session. It must belong to the application + # of the API key. + # @param documents [Array] Files to upload: JPG, JPEG, PNG, TIFF, WEBP, + # PDF or ZIP archives of them. PDFs up to 50 MB, photos up to 6 MB before compression. + # @param document_passwords [Array] One entry per file in `documents`, in the same order: the password + # of a protected PDF, empty for any other file. + # @param document_group [String] Required document group this upload answers. + # @param locale [String] Locale used to translate the response of the next step. + # @param node_id [String] Workflow node of the KYB step. Only needed when the workflow has more than one KYB + # node; by default Didit uses the session's own node. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::SessionsUploadKybDocumentsResponse] + def upload_kyb_documents( + session_id, + documents:, + document_passwords: OMIT, + document_group: OMIT, + locale: OMIT, + node_id: OMIT, + request_options: nil + ) + @client.request( + :post, + "/v3/session/{sessionId}/kyb/documents/", + path_params: { "sessionId" => session_id }, + query: { + "node_id" => node_id + }, + body: { + "documents" => documents, + "document_passwords" => document_passwords, + "document_group" => document_group, + "locale" => locale + }, + encoding: :multipart, + file_fields: %w[documents], + response: Types::SessionsUploadKybDocumentsResponse, + request_options: request_options + ) + end + # The +sessions.imports+ resource. class Imports < Didit::Resource # Cancel an import job @@ -2610,19 +3034,20 @@ def list(session_id, limit: OMIT, offset: OMIT, ordering: OMIT, request_options: class Signatures < Didit::Resource # Download a signed document # - # Download the signed PDF of one document of an Electronic Signature step. Use the `signed_file` path of + # Download the signed PDF of one document of an E-signature step. Use the `signed_file` path of # `signatures[].documents[]` in the decision. The PDF holds the document the signer was shown with their field - # values stamped, the evidence page (unless `signature_evidence_page` is off) and the PAdES signature with its - # timestamp. Didit checks the file against `sha256_signed` before returning it. + # values stamped and the evidence page (unless `signature_evidence_page` is off). An Advanced (AES) PDF also + # carries the PAdES signature with its timestamp; a Simple PDF has no digital signature, seal or timestamp. + # Didit checks the file against `sha256_signed` before returning it. # # Works for User Verification (KYC) and Business Verification (KYB) sessions. Needs `read:sessions`; your API - # key works. See the [Electronic Signature + # key works. See the [E-signature # report](/core-technology/electronic-signature/report-electronic-signature#download-the-signed-documents). # # +GET /v3/session/{sessionId}/signatures/{nodeId}/documents/{documentId}/file/+ # # @param session_id [String] The User Verification (KYC) or Business Verification (KYB) session. - # @param node_id [String] The Electronic Signature step: `node_id` of the item in `signatures[]`. + # @param node_id [String] The E-signature step: `node_id` of the item in `signatures[]`. # @param document_id [String] `id` of the document in `signatures[].documents[]`. # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body # @return [String, nil] the body bytes, or nil when a block receives the chunks @@ -2639,10 +3064,10 @@ def download_document(session_id, node_id, document_id, request_options: nil, &b # Download the signature evidence # - # Download a signer's evidence PDF: the level and format, the signer and their verified identity session, the - # code confirmation, the IP address, each document with its original SHA-256 and field values, the - # certificate, the timestamp and the SHA-256 of every signed file. Use the `evidence_file` path of the - # signer's item in `signatures[]`. + # Download a signer's evidence PDF: the level and format, the signer, the IP address, each document with its + # original SHA-256 and field values and the SHA-256 of every signed file, plus, for an Advanced (AES) + # signature, the verified identity session, the code confirmation, the certificate and the timestamp. Use the + # `evidence_file` path of the signer's item in `signatures[]`. # # Always pass `signature_id` when a Business Verification step has several signers: without it, the route # picks one of the step's signers. Needs `read:sessions`; your API key works. @@ -2650,7 +3075,7 @@ def download_document(session_id, node_id, document_id, request_options: nil, &b # +GET /v3/session/{sessionId}/signatures/{nodeId}/evidence/+ # # @param session_id [String] The User Verification (KYC) or Business Verification (KYB) session. - # @param node_id [String] The Electronic Signature step: `node_id` of the item in `signatures[]`. + # @param node_id [String] The E-signature step: `node_id` of the item in `signatures[]`. # @param signature_id [String] `id` of the signer's item in `signatures[]`. # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body # @return [String, nil] the body bytes, or nil when a block receives the chunks @@ -2676,7 +3101,7 @@ def download_evidence(session_id, node_id, signature_id: OMIT, request_options: # +GET /v3/session/{sessionId}/signatures/{nodeId}/fields/{fieldId}/image/+ # # @param session_id [String] The User Verification (KYC) or Business Verification (KYB) session. - # @param node_id [String] The Electronic Signature step: `node_id` of the item in `signatures[]`. + # @param node_id [String] The E-signature step: `node_id` of the item in `signatures[]`. # @param field_id [String] The field on this signer's copy, as in the field's `image_url`. # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body # @return [String, nil] the body bytes, or nil when a block receives the chunks @@ -2693,8 +3118,9 @@ def download_field_image(session_id, node_id, field_id, request_options: nil, &b # Validate signatures again # - # Re-check the signed documents of an Electronic Signature step. Didit re-reads every signed PDF, checks its - # SHA-256 and validates the PAdES signature, the certificate, the revocation data and the timestamp, then + # Re-check the signed documents of an E-signature step. Didit re-reads every signed PDF, checks its SHA-256 + # and, for an Advanced (AES) signature, validates the PAdES signature, the certificate, the revocation data + # and the timestamp (a Simple signature has no digital signature, so only the file integrity is checked), then # saves the result in each signer's `validation` and returns the updated items. Nothing is signed again. Send # `signature_id` to check one signer; without it, every signer of the step is checked, and the call fails if # any of them hasn't signed. @@ -2704,7 +3130,7 @@ def download_field_image(session_id, node_id, field_id, request_options: nil, &b # +POST /v3/session/{sessionId}/signatures/{nodeId}/validate/+ # # @param session_id [String] The User Verification (KYC) or Business Verification (KYB) session. - # @param node_id [String] The Electronic Signature step: `node_id` of the item in `signatures[]`. + # @param node_id [String] The E-signature step: `node_id` of the item in `signatures[]`. # @param signature_id [String] `id` of one signer's item in `signatures[]`. # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body # @return [Didit::Types::SessionsSignaturesValidateResponse] diff --git a/lib/didit/resources/transactions.rb b/lib/didit/resources/transactions.rb index 7d450c6..236b7b3 100644 --- a/lib/didit/resources/transactions.rb +++ b/lib/didit/resources/transactions.rb @@ -206,16 +206,21 @@ def generate_pdf(transaction_uuid, request_options: nil, &block) # @param travel_rule_status [String] Return only transactions whose Travel Rule transfer is in this exact status # (for example `ON_HOLD` or `AWAITING_COUNTERPARTY`). `count` follows this filter; `total_transactions` still # counts every transaction in the application. + # @param assignee [String] Comma-separated; a transaction matches when it meets any value. `unassigned` is what + # nobody holds yet, `rules` is what the rules decided on their own without a reviewer, and a member email + # matches the reviewer assigned to it. `me` is the signed-in Console reviewer, so an API key sending `me` gets + # `400`. # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body # @return [Didit::Page] - def list(limit: OMIT, offset: OMIT, travel_rule_status: OMIT, request_options: nil) + def list(limit: OMIT, offset: OMIT, travel_rule_status: OMIT, assignee: OMIT, request_options: nil) @client.request( :get, "/v3/transactions/", query: { "limit" => limit, "offset" => offset, - "travel_rule_status" => travel_rule_status + "travel_rule_status" => travel_rule_status, + "assignee" => assignee }, page: Types::TransactionsListResponseResults, request_options: request_options diff --git a/lib/didit/resources/travel_rule.rb b/lib/didit/resources/travel_rule.rb index def7648..f76c967 100644 --- a/lib/didit/resources/travel_rule.rb +++ b/lib/didit/resources/travel_rule.rb @@ -20,6 +20,11 @@ def transfers @transfers ||= Transfers.new(@client) end + # @return [Didit::Resources::TravelRule::UnmatchedDeposits] + def unmatched_deposits + @unmatched_deposits ||= UnmatchedDeposits.new(@client) + end + # @return [Didit::Resources::TravelRule::WalletAddresses] def wallet_addresses @wallet_addresses ||= WalletAddresses.new(@client) @@ -843,6 +848,97 @@ def list( end end + # The +travel_rule.unmatched_deposits+ resource. + class UnmatchedDeposits < Didit::Resource + # List unmatched Travel Rule deposits + # + # Inbound deposits that are still waiting for the originating VASP's Travel Rule data: their transfer is + # `AWAITING_COUNTERPARTY`, `NOT_ENOUGH_COUNTERPARTY_DATA` or `COUNTERPARTY_VASP_NOT_FOUND`, no received + # message is paired with them, and nobody matched them by hand. The rows and the filters are the same as in + # `GET /v3/travel-rule/transfers/`, newest first, paginated with `limit` (default 50) and `offset`. Pair a + # deposit with the message the originating VASP sent with `POST + # /v3/travel-rule/unmatched/{transaction_uuid}/match/`. + # + # +GET /v3/travel-rule/unmatched/+ + # + # @param direction [String] INBOUND, OUTBOUND, or both comma-separated. Case-sensitive. + # @param status [String] One or more transfer statuses, comma-separated. + # @param rail [String] One or more of INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL, TEST_VASP, + # comma-separated. + # @param kind [String] withdrawal, deposit or message, comma-separated. + # @param currency [String] The transaction's currency, case-insensitive. + # @param start_date [Date, String] Transfers created on or after this day (UTC), YYYY-MM-DD. + # @param end_date [Date, String] Transfers created on or before this day (UTC), YYYY-MM-DD. + # @param counterparty [String] The `id` of a directory entry or Didit network member from GET + # /v3/travel-rule/vasps/: your transfers with that counterparty. A value that is not a valid id answers 400. + # @param limit [Integer] Page size, default 50. + # @param offset [Integer] Rows to skip. + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Page] + def list( + direction: OMIT, + status: OMIT, + rail: OMIT, + kind: OMIT, + currency: OMIT, + start_date: OMIT, + end_date: OMIT, + counterparty: OMIT, + limit: OMIT, + offset: OMIT, + request_options: nil + ) + @client.request( + :get, + "/v3/travel-rule/unmatched/", + query: { + "direction" => direction, + "status" => status, + "rail" => rail, + "kind" => kind, + "currency" => currency, + "start_date" => start_date, + "end_date" => end_date, + "counterparty" => counterparty, + "limit" => limit, + "offset" => offset + }, + page: Types::TravelRuleTransferRow, + request_options: request_options + ) + end + + # Match a Travel Rule deposit to a received message + # + # Pair an inbound deposit that is still waiting for originator data with the Travel Rule message the + # originating VASP sent for it. The deposit takes the message's originator data, counterparty VASP and rail, + # and both transfers record the match on their timelines. `transaction_uuid` is the deposit's `transaction_id` + # from `GET /v3/travel-rule/unmatched/`. `transaction_id` in the body is the received message's + # `transaction_id`, from a row of `GET /v3/travel-rule/transfers/?kind=message`; the transfer's own `id` is + # not found. The message must be for the same asset as the deposit. A deposit or message deleted from the + # Console answers `404`; one that has already moved on (matched, or no longer waiting) answers `409`. + # + # +POST /v3/travel-rule/unmatched/{transaction_uuid}/match/+ + # + # @param transaction_uuid [String] The `transaction_id` of the unmatched deposit. + # @param transaction_id [String] The `transaction_id` of the received Travel Rule message (a row with `kind: + # message`). + # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body + # @return [Didit::Types::TravelRuleManualMatchResponse] + def match(transaction_uuid, transaction_id:, request_options: nil) + @client.request( + :post, + "/v3/travel-rule/unmatched/{transaction_uuid}/match/", + path_params: { "transaction_uuid" => transaction_uuid }, + body: { + "transaction_id" => transaction_id + }, + response: Types::TravelRuleManualMatchResponse, + request_options: request_options + ) + end + end + # The +travel_rule.wallet_addresses+ resource. class WalletAddresses < Didit::Resource # Import wallet addresses in bulk diff --git a/lib/didit/resources/users.rb b/lib/didit/resources/users.rb index a495700..009b343 100644 --- a/lib/didit/resources/users.rb +++ b/lib/didit/resources/users.rb @@ -15,10 +15,13 @@ class Users < Didit::Resource # `filter_has_approved_sessions` and `filter_has_declined_sessions` are not refused and not applied, so with # `delete_all: true` they still delete every user; do not send them. # - # **Biometric templates:** every image-free biometric template retained for these users after session deletion - # (see `/v3/biometric-templates/`) is purged before the user is deleted, so the person stops matching in - # duplicate detection and Face Search. If a template cannot be purged because a biometric store is unavailable, - # the call returns `503`, no user in the request is deleted, and repeating the request finishes the job. + # **Biometric templates:** unless you set `retain_face_embeddings` to `true`, every image-free biometric + # template retained for these users after session deletion (see `/v3/biometric-templates/`) is purged before the + # user is deleted, so the person stops matching in duplicate detection and Face Search. With + # `retain_face_embeddings: true` and `face_retention_days`, you choose to keep one image-free biometric template + # per person for that many days, and nothing else about the person is kept. If a template cannot be purged + # because a biometric store is unavailable, the call returns `503`, no user in the request is deleted, and + # repeating the request finishes the job. # # **Filed regulatory reports:** if the selected data is in a finalized regulatory report, the whole request is # refused with `409` and nothing is deleted. The body uses `code: in_filed_report` and names each report with @@ -30,16 +33,32 @@ class Users < Didit::Resource # @param didit_internal_id_list [Array] Didit internal user IDs to delete - the `didit_internal_id` # returned by the create and get endpoints. # @param delete_all [Boolean] If `true`, deletes every user in the application. + # @param retain_face_embeddings [Boolean] Your explicit choice to keep one image-free biometric template of each + # deleted person for duplicate detection, for `face_retention_days`. Everything else about the person is + # deleted. Omit it, or send `false`, to delete the templates with the users. When `true`, `face_retention_days` + # is required. + # @param face_retention_days [Integer] Number of days the image-free biometric template is kept when + # `retain_face_embeddings` is `true`. Required with it, and rejected without it with a `400` on + # `face_retention_days`. # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body # @return [Didit::Types::UsersBatchDeleteResponse] - def batch_delete(vendor_data_list: OMIT, didit_internal_id_list: OMIT, delete_all: OMIT, request_options: nil) + def batch_delete( + vendor_data_list: OMIT, + didit_internal_id_list: OMIT, + delete_all: OMIT, + retain_face_embeddings: OMIT, + face_retention_days: OMIT, + request_options: nil + ) @client.request( :post, "/v3/users/delete/", body: { "vendor_data_list" => vendor_data_list, "didit_internal_id_list" => didit_internal_id_list, - "delete_all" => delete_all + "delete_all" => delete_all, + "retain_face_embeddings" => retain_face_embeddings, + "face_retention_days" => face_retention_days }, response: Types::UsersBatchDeleteResponse, request_options: request_options diff --git a/lib/didit/resources/wallet_screening.rb b/lib/didit/resources/wallet_screening.rb index 5aa1ef1..162f3c7 100644 --- a/lib/didit/resources/wallet_screening.rb +++ b/lib/didit/resources/wallet_screening.rb @@ -17,18 +17,17 @@ class WalletScreening < Didit::Resource # # @param wallet_address [String] The crypto address or network identifier to screen. Must match the selected # network (e.g. a `0x`-prefixed 40-hex-char address for EVM chains). Alias: `address`. - # @param blockchain [String] Network identifier. Managed screening supports BTC, ETH, LTC, XRP, BCH, DOGE, TRX, - # SOL, MATIC, BNB, BASE (Base), OP (Optimism), and ARB (Arbitrum One). USDT and USDC are legacy Ethereum - # aliases, not multi-network searches. Connected-provider coverage varies. LIGHTNING requires a supported - # connected provider. CELO (Celo), MODE (Mode) and PLUME (Plume) are screened through a connected TRM Labs - # acco... + # @param blockchain [String] Optional network identifier. When omitted, the network is read from the address + # format: `bc1`, `1` and `3` addresses are Bitcoin (BTC), `T` addresses are Tron (TRX) and base58 public keys + # are Solana (SOL). A `0x` address is valid on every EVM network, so omitting `blockchain` for it answers 422 + # with the candidate networks in `candidate_chains`. Managed screening supports BTC, ETH, LTC, XRP, BCH,... # @param direction [String] Optional. Whether the address is being screened as an inbound (deposit) or outbound # (withdrawal) counterparty. Accepts `inbound`, `outbound`, `deposit`, or `withdrawal`. Defaults to a neutral # pre-transfer screen when omitted. This is passed to the provider as context only; it does not change the # returned `risk_score`, `severity`, or the `source_of_funds`/`destination_of_funds` breakdowns, which a... # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body # @return [Didit::Types::WalletScreeningResult] - def screen(wallet_address:, blockchain:, direction: OMIT, request_options: nil) + def screen(wallet_address:, blockchain: OMIT, direction: OMIT, request_options: nil) @client.request( :post, "/v3/wallet-screening/", diff --git a/lib/didit/resources/webhooks.rb b/lib/didit/resources/webhooks.rb index 8f65910..4a27ecb 100644 --- a/lib/didit/resources/webhooks.rb +++ b/lib/didit/resources/webhooks.rb @@ -73,6 +73,11 @@ def retrieve_config(request_options: nil) # @param allowed_return_hosts [Array] Replaces the whole list of Digital ID wallet return hosts. Bare # hostnames only, such as `shop.example.com`: no scheme, port, path or wildcard. Values are lowercased and # duplicates are dropped. Send `[]` to clear the list. + # @param allowed_domains [Array] Replaces the whole list of allowed origins. Origins (for example + # `https://app.example.com`; `http` only for `localhost`) the hosted verification flow may be embedded in and + # may send the user back to with a session callback. Server-to-server calls are not affected. An empty list + # means no restriction. Didit stores each origin in lower case without a default port. An invalid entry fails + # with `400` o... # @param request_options [Hash, nil] :timeout, :max_retries, :extra_headers, :extra_query, :extra_body # @return [Didit::Types::WebhookConfig] def update_config( @@ -85,6 +90,7 @@ def update_config( face_retention_days: OMIT, biometric_consent_mode: OMIT, allowed_return_hosts: OMIT, + allowed_domains: OMIT, request_options: nil ) @client.request( @@ -99,7 +105,8 @@ def update_config( "face_retention_policy" => face_retention_policy, "face_retention_days" => face_retention_days, "biometric_consent_mode" => biometric_consent_mode, - "allowed_return_hosts" => allowed_return_hosts + "allowed_return_hosts" => allowed_return_hosts, + "allowed_domains" => allowed_domains }, response: Types::WebhookConfig, request_options: request_options diff --git a/lib/didit/types.rb b/lib/didit/types.rb index 98ffa10..0881bb3 100644 --- a/lib/didit/types.rb +++ b/lib/didit/types.rb @@ -81,6 +81,7 @@ module Types autoload :AmlScreenResponseAmlEntityType, "didit/types/aml" autoload :AmlScreenResponseAmlHits, "didit/types/aml" autoload :AmlScreenResponseAmlHitsAdverseMediaMatches, "didit/types/aml" + autoload :AmlScreenResponseAmlHitsDatasets, "didit/types/aml" autoload :AmlScreenResponseAmlHitsLinkedEntities, "didit/types/aml" autoload :AmlScreenResponseAmlHitsPepMatches, "didit/types/aml" autoload :AmlScreenResponseAmlHitsReviewStatus, "didit/types/aml" @@ -112,6 +113,8 @@ module Types autoload :ApplicationAnalyticsRequestBreakdown, "didit/types/components" autoload :ApplicationAnalyticsResubmissionPoint, "didit/types/components" autoload :ApplicationAnalyticsResubmissionStats, "didit/types/components" + autoload :ApplicationAnalyticsToday, "didit/types/components" + autoload :ApplicationAnalyticsTodayOutcomes, "didit/types/components" autoload :ApplicationAnalyticsVerificationTimePoint, "didit/types/components" autoload :ApplicationAnalyticsVerificationTimeStats, "didit/types/components" autoload :ApplicationAnalyticsVerificationTimeStatsPerFeatureValue, "didit/types/components" @@ -164,6 +167,7 @@ module Types autoload :BankVerificationResultStatus, "didit/types/components" autoload :BillingRetrieveBalanceResponse, "didit/types/billing" autoload :BillingTopUpResponse, "didit/types/billing" + autoload :BiometricRetention, "didit/types/components" autoload :BiometricTemplatesBatchDeleteParamsSourceType, "didit/types/biometric_templates" autoload :BiometricTemplatesBatchDeleteParamsStatus, "didit/types/biometric_templates" autoload :BiometricTemplatesBatchDeleteResponse, "didit/types/biometric_templates" @@ -381,6 +385,7 @@ module Types autoload :DigitalIdWalletApiEudiWalletVerificationStartCountryEnum, "didit/types/components" autoload :DigitalIdWalletApiFranceconnectWalletVerificationStartCountryEnum, "didit/types/components" autoload :DigitalIdWalletApiFtnWalletVerificationStartCountryEnum, "didit/types/components" + autoload :DigitalIdWalletApiGoogleWalletWalletVerificationStartCountryEnum, "didit/types/components" autoload :DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum, "didit/types/components" autoload :DigitalIdWalletApiIdcardEeWalletVerificationStartCountryEnum, "didit/types/components" autoload :DigitalIdWalletApiIdinWalletVerificationStartCountryEnum, "didit/types/components" @@ -394,6 +399,7 @@ module Types autoload :DigitalIdWalletApiWallet, "didit/types/components" autoload :DigitalIdWalletApiWalletCatalogEntry, "didit/types/components" autoload :DigitalIdWalletApiWalletCatalogResponse, "didit/types/components" + autoload :DigitalIdWalletApiWalletDigitalCredentialsRequest, "didit/types/components" autoload :DigitalIdWalletApiWalletIdentity, "didit/types/components" autoload :DigitalIdWalletApiWalletNextAction, "didit/types/components" autoload :DigitalIdWalletApiWalletNextActionTypeEnum, "didit/types/components" @@ -418,8 +424,13 @@ module Types autoload :EmailCheckCodeParamsBreachedEmailAction, "didit/types/email" autoload :EmailCheckCodeParamsDisposableEmailAction, "didit/types/email" autoload :EmailCheckCodeParamsDuplicatedEmailAction, "didit/types/email" + autoload :EmailCheckCodeParamsEmailIntelligenceScoreAction, "didit/types/email" autoload :EmailCheckCodeParamsEmailNoSocialPresenceAction, "didit/types/email" + autoload :EmailCheckCodeParamsFrequentEmailBreachAction, "didit/types/email" + autoload :EmailCheckCodeParamsRecentEmailBreachAction, "didit/types/email" autoload :EmailIntelligence, "didit/types/components" + autoload :EmailIntelligenceReasonCodes, "didit/types/components" + autoload :EmailIntelligenceReasonCodesDirection, "didit/types/components" autoload :EmailMatchItem, "didit/types/components" autoload :EmailRiskResponse, "didit/types/components" autoload :EmailRiskResponseEmail, "didit/types/components" @@ -493,6 +504,36 @@ module Types autoload :FraudResultEnum, "didit/types/components" autoload :FraudStatusEnum, "didit/types/components" autoload :FraudTypeEnum, "didit/types/components" + autoload :GeolocationAttempt, "didit/types/components" + autoload :GeolocationAttemptAccuracyConfidence, "didit/types/components" + autoload :GeolocationAttemptAnonymizers, "didit/types/components" + autoload :GeolocationAttemptConsent, "didit/types/components" + autoload :GeolocationAttemptGeofence, "didit/types/components" + autoload :GeolocationAttemptGeofenceBasis, "didit/types/components" + autoload :GeolocationAttemptGeofenceResult, "didit/types/components" + autoload :GeolocationAttemptIntegrity, "didit/types/components" + autoload :GeolocationAttemptOutcome, "didit/types/components" + autoload :GeolocationAttemptPermission, "didit/types/components" + autoload :GeolocationAttemptPlatform, "didit/types/components" + autoload :GeolocationAttemptPositionSource, "didit/types/components" + autoload :GeolocationAttemptSource, "didit/types/components" + autoload :GeolocationAttemptStatus, "didit/types/components" + autoload :GeolocationCheck, "didit/types/components" + autoload :GeolocationCheckAccuracyConfidence, "didit/types/components" + autoload :GeolocationCheckAnonymizers, "didit/types/components" + autoload :GeolocationCheckConsent, "didit/types/components" + autoload :GeolocationCheckGeofence, "didit/types/components" + autoload :GeolocationCheckGeofenceBasis, "didit/types/components" + autoload :GeolocationCheckGeofenceResult, "didit/types/components" + autoload :GeolocationCheckIntegrity, "didit/types/components" + autoload :GeolocationCheckOutcome, "didit/types/components" + autoload :GeolocationCheckPermission, "didit/types/components" + autoload :GeolocationCheckPlatform, "didit/types/components" + autoload :GeolocationCheckPositionSource, "didit/types/components" + autoload :GeolocationCheckSource, "didit/types/components" + autoload :GeolocationCheckStatus, "didit/types/components" + autoload :GeolocationCheckWarnings, "didit/types/components" + autoload :GeolocationCheckWarningsFeature, "didit/types/components" autoload :IPRiskResponse, "didit/types/components" autoload :IPRiskResponseIp, "didit/types/components" autoload :IPRiskResponseIpStatus, "didit/types/components" @@ -588,8 +629,15 @@ module Types autoload :KYBKeyPeoplePartySource, "didit/types/components" autoload :KYBKeyPeoplePartyVerificationWorkflowFeatures, "didit/types/components" autoload :KYBKeyPeoplePartyVerificationWorkflowType, "didit/types/components" + autoload :KYBOwnershipStructure, "didit/types/components" + autoload :KYBOwnershipStructureOwner, "didit/types/components" + autoload :KYBOwnershipStructureOwnerEntityType, "didit/types/components" autoload :KYBRegistryAddress, "didit/types/components" + autoload :KYBRegistryData, "didit/types/components" + autoload :KYBRegistryDataOwnershipError, "didit/types/components" + autoload :KYBRegistryGroupCompany, "didit/types/components" autoload :KYBRegistryIndustry, "didit/types/components" + autoload :KYBRegistryLiteEnrichment, "didit/types/components" autoload :KYBRegistryOwnership, "didit/types/components" autoload :KYBRegistryOwnershipStatus, "didit/types/components" autoload :KYBRegistryOwnershipTierDelivered, "didit/types/components" @@ -600,7 +648,12 @@ module Types autoload :KYBRegistrySearchResultsCompanies, "didit/types/components" autoload :KYBRegistrySearchResultsPagination, "didit/types/components" autoload :KYBRegistrySearchResultsSearchStatus, "didit/types/components" + autoload :KYBRegistrySectionError, "didit/types/components" autoload :KYBRegistryShareholding, "didit/types/components" + autoload :KYBRegistrySource, "didit/types/components" + autoload :KYBRegistrySourceSourceType, "didit/types/components" + autoload :KYBRegistryUboResolution, "didit/types/components" + autoload :KYBRegistryUboResolutionUnresolved, "didit/types/components" autoload :KybListShareholdersResponse, "didit/types/kyb" autoload :KybListShareholdersResponse202, "didit/types/kyb" autoload :KybListShareholdersResponse202KybRegistry, "didit/types/kyb" @@ -611,6 +664,7 @@ module Types autoload :KybListShareholdersResponse202KybRegistryOfficers, "didit/types/kyb" autoload :KybListShareholdersResponse202KybRegistryOfficersKycStatus, "didit/types/kyb" autoload :KybListShareholdersResponse202KybRegistryOfficersRole, "didit/types/kyb" + autoload :KybListShareholdersResponse202KybRegistryRegistryMonitoring, "didit/types/kyb" autoload :KybListShareholdersResponse202KybRegistryRegistryOwnershipStatus, "didit/types/kyb" autoload :KybListShareholdersResponse202KybRegistryRegistryStatus, "didit/types/kyb" autoload :KybListShareholdersResponse202KybRegistryRegistryTierDelivered, "didit/types/kyb" @@ -627,6 +681,7 @@ module Types autoload :KybListShareholdersResponseKybRegistryOfficers, "didit/types/kyb" autoload :KybListShareholdersResponseKybRegistryOfficersKycStatus, "didit/types/kyb" autoload :KybListShareholdersResponseKybRegistryOfficersRole, "didit/types/kyb" + autoload :KybListShareholdersResponseKybRegistryRegistryMonitoring, "didit/types/kyb" autoload :KybListShareholdersResponseKybRegistryRegistryOwnershipStatus, "didit/types/kyb" autoload :KybListShareholdersResponseKybRegistryRegistryStatus, "didit/types/kyb" autoload :KybListShareholdersResponseKybRegistryRegistryTierDelivered, "didit/types/kyb" @@ -645,6 +700,7 @@ module Types autoload :KybListUbosResponse202KybRegistryOfficers, "didit/types/kyb" autoload :KybListUbosResponse202KybRegistryOfficersKycStatus, "didit/types/kyb" autoload :KybListUbosResponse202KybRegistryOfficersRole, "didit/types/kyb" + autoload :KybListUbosResponse202KybRegistryRegistryMonitoring, "didit/types/kyb" autoload :KybListUbosResponse202KybRegistryRegistryOwnershipStatus, "didit/types/kyb" autoload :KybListUbosResponse202KybRegistryRegistryStatus, "didit/types/kyb" autoload :KybListUbosResponse202KybRegistryRegistryTierDelivered, "didit/types/kyb" @@ -661,6 +717,7 @@ module Types autoload :KybListUbosResponseKybRegistryOfficers, "didit/types/kyb" autoload :KybListUbosResponseKybRegistryOfficersKycStatus, "didit/types/kyb" autoload :KybListUbosResponseKybRegistryOfficersRole, "didit/types/kyb" + autoload :KybListUbosResponseKybRegistryRegistryMonitoring, "didit/types/kyb" autoload :KybListUbosResponseKybRegistryRegistryOwnershipStatus, "didit/types/kyb" autoload :KybListUbosResponseKybRegistryRegistryStatus, "didit/types/kyb" autoload :KybListUbosResponseKybRegistryRegistryTierDelivered, "didit/types/kyb" @@ -681,6 +738,7 @@ module Types autoload :KybSelectResponseKybRegistryOfficers, "didit/types/kyb" autoload :KybSelectResponseKybRegistryOfficersKycStatus, "didit/types/kyb" autoload :KybSelectResponseKybRegistryOfficersRole, "didit/types/kyb" + autoload :KybSelectResponseKybRegistryRegistryMonitoring, "didit/types/kyb" autoload :KybSelectResponseKybRegistryRegistryOwnershipStatus, "didit/types/kyb" autoload :KybSelectResponseKybRegistryRegistryStatus, "didit/types/kyb" autoload :KybSelectResponseKybRegistryRegistryTierDelivered, "didit/types/kyb" @@ -825,9 +883,15 @@ module Types autoload :PassiveLivenessCheckResponseLivenessWarningsRisk, "didit/types/passive_liveness" autoload :PhoneCheckCodeParamsDisposableNumberAction, "didit/types/phone" autoload :PhoneCheckCodeParamsDuplicatedPhoneNumberAction, "didit/types/phone" + autoload :PhoneCheckCodeParamsLowPhoneTrustAction, "didit/types/phone" + autoload :PhoneCheckCodeParamsPhoneIntelligenceScoreAction, "didit/types/phone" autoload :PhoneCheckCodeParamsPhoneNoSocialPresenceAction, "didit/types/phone" + autoload :PhoneCheckCodeParamsPhoneTypeRiskAction, "didit/types/phone" + autoload :PhoneCheckCodeParamsRecentPortAction, "didit/types/phone" autoload :PhoneCheckCodeParamsVoipNumberAction, "didit/types/phone" autoload :PhoneIntelligence, "didit/types/components" + autoload :PhoneIntelligenceReasonCodes, "didit/types/components" + autoload :PhoneIntelligenceReasonCodesDirection, "didit/types/components" autoload :PhoneMatchItem, "didit/types/components" autoload :PhoneRiskResponse, "didit/types/components" autoload :PhoneRiskResponsePhone, "didit/types/components" @@ -917,12 +981,14 @@ module Types autoload :SandboxSimulateResponsePreviousStatus, "didit/types/components" autoload :SandboxSimulateResponseStatus, "didit/types/components" autoload :SessionDecision, "didit/types/components" + autoload :SessionDecisionAssignee, "didit/types/components" autoload :SessionDecisionBiometricConsent, "didit/types/components" autoload :SessionDecisionBiometricConsentDeclineReason, "didit/types/components" autoload :SessionDecisionBiometricConsentReason, "didit/types/components" autoload :SessionDecisionBiometricConsentStatus, "didit/types/components" autoload :SessionDecisionBiometricConsentTrigger, "didit/types/components" autoload :SessionDecisionContactDetails, "didit/types/components" + autoload :SessionDecisionDatabaseValidationNotPerformedReason, "didit/types/components" autoload :SessionDecisionDatabaseValidations, "didit/types/components" autoload :SessionDecisionDatabaseValidationsErrors, "didit/types/components" autoload :SessionDecisionDatabaseValidationsMatchType, "didit/types/components" @@ -933,6 +999,10 @@ module Types autoload :SessionDecisionDatabaseValidationsValidationsValidation, "didit/types/components" autoload :SessionDecisionDatabaseValidationsWarnings, "didit/types/components" autoload :SessionDecisionDatabaseValidationsWarningsFeature, "didit/types/components" + autoload :SessionDecisionDecisionTrace, "didit/types/components" + autoload :SessionDecisionDecisionTraceActor, "didit/types/components" + autoload :SessionDecisionDecisionTraceDecidedBy, "didit/types/components" + autoload :SessionDecisionDecisionTraceStatusWarnings, "didit/types/components" autoload :SessionDecisionDocumentAiDocuments, "didit/types/components" autoload :SessionDecisionDocumentAiDocumentsItems, "didit/types/components" autoload :SessionDecisionDocumentAiDocumentsItemsFields, "didit/types/components" @@ -962,6 +1032,10 @@ module Types autoload :SessionDecisionExpectedDetailsExpectedDocumentTypes, "didit/types/components" autoload :SessionDecisionExpectedDetailsGender, "didit/types/components" autoload :SessionDecisionFaceMatches, "didit/types/components" + autoload :SessionDecisionFaceMatchesFaceCoverage, "didit/types/components" + autoload :SessionDecisionFaceMatchesFaceCoverageEyes, "didit/types/components" + autoload :SessionDecisionFaceMatchesFaceCoverageFace, "didit/types/components" + autoload :SessionDecisionFaceMatchesFaceCoverageMouth, "didit/types/components" autoload :SessionDecisionFaceMatchesStatus, "didit/types/components" autoload :SessionDecisionFaceMatchesWarnings, "didit/types/components" autoload :SessionDecisionFaceMatchesWarningsFeature, "didit/types/components" @@ -1061,6 +1135,12 @@ module Types autoload :SessionDecisionKeyPeopleChecksSubmittedPartiesVerificationWorkflowFeatures, "didit/types/components" autoload :SessionDecisionKeyPeopleChecksSubmittedPartiesVerificationWorkflowFeaturesStatus, "didit/types/components" autoload :SessionDecisionKeyPeopleChecksUboKycSummary, "didit/types/components" + autoload :SessionDecisionLinkedRecords, "didit/types/components" + autoload :SessionDecisionLinkedRecordsEarlierVerifications, "didit/types/components" + autoload :SessionDecisionLinkedRecordsNetworks, "didit/types/components" + autoload :SessionDecisionLinkedRecordsNetworksItems, "didit/types/components" + autoload :SessionDecisionLinkedRecordsSameFace, "didit/types/components" + autoload :SessionDecisionLinkedRecordsSameFaceBestMatch, "didit/types/components" autoload :SessionDecisionLivenessChecks, "didit/types/components" autoload :SessionDecisionLivenessChecksMatches, "didit/types/components" autoload :SessionDecisionLivenessChecksMatchesSource, "didit/types/components" @@ -1118,6 +1198,7 @@ module Types autoload :SessionDecisionRegistryChecksCompanyBeneficialOwnersKycStatus, "didit/types/components" autoload :SessionDecisionRegistryChecksCompanyOfficers, "didit/types/components" autoload :SessionDecisionRegistryChecksCompanyOfficersKycStatus, "didit/types/components" + autoload :SessionDecisionRegistryChecksCompanyRegistryMonitoring, "didit/types/components" autoload :SessionDecisionRegistryChecksCompanyRiskLevel, "didit/types/components" autoload :SessionDecisionRegistryChecksCompanyVatValidationSource, "didit/types/components" autoload :SessionDecisionRegistryChecksCompanyVatValidationStatus, "didit/types/components" @@ -1127,12 +1208,15 @@ module Types autoload :SessionDecisionReviews, "didit/types/components" autoload :SessionDecisionSessionKind, "didit/types/components" autoload :SessionDecisionStatus, "didit/types/components" + autoload :SessionDecisionStatusOverride, "didit/types/components" autoload :SessionDeletionJob, "didit/types/components" autoload :SessionDeletionJobOutcomes, "didit/types/components" autoload :SessionDeletionJobStatus, "didit/types/components" autoload :SessionEvent, "didit/types/components" autoload :SessionEventEventType, "didit/types/components" autoload :SessionEventFeatureStep, "didit/types/components" + autoload :SessionFilesExport, "didit/types/components" + autoload :SessionFilesExportStatus, "didit/types/components" autoload :SessionImportError, "didit/types/components" autoload :SessionImportJob, "didit/types/components" autoload :SessionImportJobImportType, "didit/types/components" @@ -1149,6 +1233,14 @@ module Types autoload :SessionsBatchDeleteResponseResultsFaceRetentionOutcome, "didit/types/sessions" autoload :SessionsBulkUpdateAmlHitStatusParamsHitUpdatesReviewStatus, "didit/types/sessions" autoload :SessionsBulkUpdateAmlHitStatusResponse, "didit/types/sessions" + autoload :SessionsCreateKybPartyDraftParamsEntityType, "didit/types/sessions" + autoload :SessionsCreateKybPartyDraftParamsRole, "didit/types/sessions" + autoload :SessionsCreateKybPartyDraftParamsRoles, "didit/types/sessions" + autoload :SessionsCreateKybPartyDraftResponse, "didit/types/sessions" + autoload :SessionsCreateKybPartyDraftResponseParty, "didit/types/sessions" + autoload :SessionsCreateKybPartyDraftResponsePartyEntityType, "didit/types/sessions" + autoload :SessionsCreateKybPartyDraftResponsePartyRole, "didit/types/sessions" + autoload :SessionsCreateKybPartyDraftResponsePartyRoles, "didit/types/sessions" autoload :SessionsCreateParamsCallbackMethod, "didit/types/sessions" autoload :SessionsCreateParamsContactDetailsEmailLang, "didit/types/sessions" autoload :SessionsCreateParamsExpectedDetailsExpectedDocumentTypes, "didit/types/sessions" @@ -1177,6 +1269,19 @@ module Types autoload :SessionsListAmlScreeningHistoryResponse, "didit/types/sessions" autoload :SessionsListEventsResponse, "didit/types/sessions" autoload :SessionsListFeatureOverridesResponse, "didit/types/sessions" + autoload :SessionsListKybExtractedPartiesResponse, "didit/types/sessions" + autoload :SessionsListKybExtractedPartiesResponseParties, "didit/types/sessions" + autoload :SessionsListKybExtractedPartiesResponsePartiesDocuments, "didit/types/sessions" + autoload :SessionsListKybExtractedPartiesResponsePartiesEntityType, "didit/types/sessions" + autoload :SessionsListKybExtractedPartiesResponsePartiesRoles, "didit/types/sessions" + autoload :SessionsListKybExtractedPartiesResponsePartiesRolesOwnershipPercent, "didit/types/sessions" + autoload :SessionsListKybExtractedPartiesResponsePartiesRolesRole, "didit/types/sessions" + autoload :SessionsListKybPartyDraftsResponse, "didit/types/sessions" + autoload :SessionsListKybPartyDraftsResponseParties, "didit/types/sessions" + autoload :SessionsListKybPartyDraftsResponsePartiesParty, "didit/types/sessions" + autoload :SessionsListKybPartyDraftsResponsePartiesPartyEntityType, "didit/types/sessions" + autoload :SessionsListKybPartyDraftsResponsePartiesPartyRole, "didit/types/sessions" + autoload :SessionsListKybPartyDraftsResponsePartiesPartyRoles, "didit/types/sessions" autoload :SessionsListParamsApiService, "didit/types/sessions" autoload :SessionsListParamsSessionKind, "didit/types/sessions" autoload :SessionsListResponse, "didit/types/sessions" @@ -1190,6 +1295,7 @@ module Types autoload :SessionsListResponseResultsAdditionalDetailsLiveness, "didit/types/sessions" autoload :SessionsListResponseResultsAdditionalDetailsPhoneVerification, "didit/types/sessions" autoload :SessionsListResponseResultsAdditionalDetailsPoa, "didit/types/sessions" + autoload :SessionsListResponseResultsAssignee, "didit/types/sessions" autoload :SessionsListResponseResultsDocumentType, "didit/types/sessions" autoload :SessionsListResponseResultsEmailAddress, "didit/types/sessions" autoload :SessionsListResponseResultsFeatures, "didit/types/sessions" @@ -1198,6 +1304,7 @@ module Types autoload :SessionsListResponseResultsPhoneNumber, "didit/types/sessions" autoload :SessionsListResponseResultsSessionKind, "didit/types/sessions" autoload :SessionsListResponseResultsStatus, "didit/types/sessions" + autoload :SessionsListResponseResultsTopWarnings, "didit/types/sessions" autoload :SessionsPreviewDecisionEmailParamsNewStatus, "didit/types/sessions" autoload :SessionsPreviewDecisionEmailResponse, "didit/types/sessions" autoload :SessionsPreviewDecisionEmailResponseNotSentReason, "didit/types/sessions" @@ -1219,6 +1326,7 @@ module Types autoload :SessionsShareResponseSessionKind, "didit/types/sessions" autoload :SessionsSignaturesValidateResponse, "didit/types/sessions" autoload :SessionsSimulateParamsNewStatus, "didit/types/sessions" + autoload :SessionsSubmitKybPartiesResponse, "didit/types/sessions" autoload :SessionsUpdateAmlHitStatusParamsReviewStatus, "didit/types/sessions" autoload :SessionsUpdateAmlHitStatusResponse, "didit/types/sessions" autoload :SessionsUpdateAmlHitStatusResponseReviewStatus, "didit/types/sessions" @@ -1245,6 +1353,14 @@ module Types autoload :SessionsUpdateKybCompanyDataResponse, "didit/types/sessions" autoload :SessionsUpdateKybCompanyDataResponseVatValidationSource, "didit/types/sessions" autoload :SessionsUpdateKybCompanyDataResponseVatValidationStatus, "didit/types/sessions" + autoload :SessionsUpdateKybPartyDraftParamsEntityType, "didit/types/sessions" + autoload :SessionsUpdateKybPartyDraftParamsRole, "didit/types/sessions" + autoload :SessionsUpdateKybPartyDraftParamsRoles, "didit/types/sessions" + autoload :SessionsUpdateKybPartyDraftResponse, "didit/types/sessions" + autoload :SessionsUpdateKybPartyDraftResponseParty, "didit/types/sessions" + autoload :SessionsUpdateKybPartyDraftResponsePartyEntityType, "didit/types/sessions" + autoload :SessionsUpdateKybPartyDraftResponsePartyRole, "didit/types/sessions" + autoload :SessionsUpdateKybPartyDraftResponsePartyRoles, "didit/types/sessions" autoload :SessionsUpdateKybPartyResponse, "didit/types/sessions" autoload :SessionsUpdateKybPartyResponseEntityType, "didit/types/sessions" autoload :SessionsUpdatePoaDataParamsDocumentType, "didit/types/sessions" @@ -1254,6 +1370,8 @@ module Types autoload :SessionsUpdateStatusParamsNewStatus, "didit/types/sessions" autoload :SessionsUpdateStatusParamsNodesToResubmitFeature, "didit/types/sessions" autoload :SessionsUpdateStatusResponse, "didit/types/sessions" + autoload :SessionsUploadKybDocumentsParamsDocumentGroup, "didit/types/sessions" + autoload :SessionsUploadKybDocumentsResponse, "didit/types/sessions" autoload :SignatureFieldAnchorOccurrence, "didit/types/components" autoload :SignatureFieldDateFormat, "didit/types/components" autoload :SignatureFieldResult, "didit/types/components" @@ -1452,6 +1570,7 @@ module Types autoload :TravelRuleListVaspsParamsResponsiveness, "didit/types/travel_rule" autoload :TravelRuleListVaspsParamsRisk, "didit/types/travel_rule" autoload :TravelRuleListVaspsResponse, "didit/types/travel_rule" + autoload :TravelRuleManualMatchResponse, "didit/types/components" autoload :TravelRuleMatchingRules, "didit/types/components" autoload :TravelRuleMatchingRulesCompany, "didit/types/components" autoload :TravelRuleMatchingRulesCompanyAccount, "didit/types/components" @@ -1521,6 +1640,7 @@ module Types autoload :TravelRuleTransferRowRail, "didit/types/components" autoload :TravelRuleTransferRowStatus, "didit/types/components" autoload :TravelRuleTransfersListResponse, "didit/types/travel_rule" + autoload :TravelRuleUnmatchedDepositsListResponse, "didit/types/travel_rule" autoload :TravelRuleUpdateSettingsParamsDisabledNetworks, "didit/types/travel_rule" autoload :TravelRuleUpdateSettingsParamsNameMatchingStrictness, "didit/types/travel_rule" autoload :TravelRuleUpdateSettingsParamsNonResponsivePolicy, "didit/types/travel_rule" @@ -1668,6 +1788,7 @@ module Types autoload :WebhooksUpdateConfigParamsFaceRetentionPolicy, "didit/types/webhooks" autoload :WebhooksUpdateConfigParamsWebhookVersion, "didit/types/webhooks" autoload :WorkflowDetail, "didit/types/components" + autoload :WorkflowDetailSignatureAvailability, "didit/types/components" autoload :WorkflowDetailStatus, "didit/types/components" autoload :WorkflowDetailWorkflowType, "didit/types/components" autoload :WorkflowListItem, "didit/types/components" diff --git a/lib/didit/types/aml.rb b/lib/didit/types/aml.rb index 6aae028..cd5aa2d 100644 --- a/lib/didit/types/aml.rb +++ b/lib/didit/types/aml.rb @@ -29,6 +29,25 @@ module AmlScreenResponseAmlEntityType VALUES = [PERSON, COMPANY].freeze end + # Known values of an open enum: the API may send others. + module AmlScreenResponseAmlHitsDatasets + PEP = "PEP" + PEP_LEVEL_1 = "PEP Level 1" + PEP_LEVEL_2 = "PEP Level 2" + PEP_LEVEL_3 = "PEP Level 3" + PEP_LEVEL_4 = "PEP Level 4" + SANCTIONS = "Sanctions" + ADVERSE_MEDIA = "Adverse Media" + WARNINGS_AND_REGULATORY_ENFORCEMENT = "Warnings and Regulatory Enforcement" + FITNESS_AND_PROBITY = "Fitness and Probity" + SIP = "SIP" + SIE = "SIE" + INSOLVENCY = "Insolvency" + OTHER_LISTS = "Other Lists" + + VALUES = [PEP, PEP_LEVEL_1, PEP_LEVEL_2, PEP_LEVEL_3, PEP_LEVEL_4, SANCTIONS, ADVERSE_MEDIA, WARNINGS_AND_REGULATORY_ENFORCEMENT, FITNESS_AND_PROBITY, SIP, SIE, INSOLVENCY, OTHER_LISTS].freeze + end + # `False Positive` - `match_score` below `aml_match_score_threshold`, excluded from risk assessment. `Unreviewed` # - possible match awaiting review. `Confirmed Match` / `Inconclusive` - set manually by a reviewer (via the # Business Console) on saved sessions; that review capability is not part of this spec. diff --git a/lib/didit/types/components.rb b/lib/didit/types/components.rb index 705a033..57236b1 100644 --- a/lib/didit/types/components.rb +++ b/lib/didit/types/components.rb @@ -83,8 +83,9 @@ module AMLScreeningHitsDatasets SIP = "SIP" SIE = "SIE" INSOLVENCY = "Insolvency" + OTHER_LISTS = "Other Lists" - VALUES = [PEP, PEP_LEVEL_1, PEP_LEVEL_2, PEP_LEVEL_3, PEP_LEVEL_4, SANCTIONS, ADVERSE_MEDIA, WARNINGS_AND_REGULATORY_ENFORCEMENT, FITNESS_AND_PROBITY, SIP, SIE, INSOLVENCY].freeze + VALUES = [PEP, PEP_LEVEL_1, PEP_LEVEL_2, PEP_LEVEL_3, PEP_LEVEL_4, SANCTIONS, ADVERSE_MEDIA, WARNINGS_AND_REGULATORY_ENFORCEMENT, FITNESS_AND_PROBITY, SIP, SIE, INSOLVENCY, OTHER_LISTS].freeze end # Review status for this hit. Can be 'Unreviewed', 'Confirmed Match', 'False Positive', or 'Inconclusive'. @@ -183,8 +184,10 @@ module AMLScreeningWarningsFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_DOCUMENTS = "KYB_DOCUMENTS" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE].freeze + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze end # `verified`: the address was confirmed down to the building (or the flat or PO box). `partially_verified`: it was @@ -1019,6 +1022,21 @@ module DigitalIdWalletApiFtnWalletVerificationStartCountryEnum VALUES = [FIN].freeze end + # * `USA` - USA + # * `GBR` - GBR + # * `BRA` - BRA + # * `SGP` - SGP + # * `TWN` - TWN + module DigitalIdWalletApiGoogleWalletWalletVerificationStartCountryEnum + USA = "USA" + GBR = "GBR" + BRA = "BRA" + SGP = "SGP" + TWN = "TWN" + + VALUES = [USA, GBR, BRA, SGP, TWN].freeze + end + # * `BRA` - BRA module DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum BRA = "BRA" @@ -1042,11 +1060,13 @@ module DigitalIdWalletApiIdinWalletVerificationStartCountryEnum # * `redirect` - redirect # * `in_app` - in_app + # * `digital_credentials` - digital_credentials module DigitalIdWalletApiInteractionEnum REDIRECT = "redirect" IN_APP = "in_app" + DIGITAL_CREDENTIALS = "digital_credentials" - VALUES = [REDIRECT, IN_APP].freeze + VALUES = [REDIRECT, IN_APP, DIGITAL_CREDENTIALS].freeze end # * `BEL` - BEL @@ -1105,11 +1125,13 @@ module DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum # * `redirect` - redirect # * `confirm_in_app` - confirm_in_app + # * `request_digital_credential` - request_digital_credential module DigitalIdWalletApiWalletNextActionTypeEnum REDIRECT = "redirect" CONFIRM_IN_APP = "confirm_in_app" + REQUEST_DIGITAL_CREDENTIAL = "request_digital_credential" - VALUES = [REDIRECT, CONFIRM_IN_APP].freeze + VALUES = [REDIRECT, CONFIRM_IN_APP, REQUEST_DIGITAL_CREDENTIAL].freeze end # * `pending` - Pending @@ -1127,6 +1149,14 @@ module DigitalIdWalletApiWalletVerificationResultOutcomeEnum VALUES = [PENDING, VERIFIED, CANCELLED, TIMEOUT, FAILED].freeze end + # Whether the signal raised the risk or added trust. + module EmailIntelligenceReasonCodesDirection + RISK = "risk" + TRUST = "trust" + + VALUES = [RISK, TRUST].freeze + end + # Decision for this email address. Mirrors the top-level `status`. module EmailRiskResponseEmailStatus APPROVED = "Approved" @@ -1428,6 +1458,280 @@ module FraudTypeEnum VALUES = [EMAIL, PHONE, NATIONAL_ID, TAX_NUMBER, PASSPORT_NUMBER, DRIVING_LICENCE_NUMBER, RESIDENCE_PERMIT_NUMBER, VOTER_ID, EXTERNAL_ID].freeze end + # Confidence level the platform attaches to `accuracy_m`: `p95` (browsers), `p68` (Android) or `unspecified` + # (iOS). + module GeolocationAttemptAccuracyConfidence + P95 = "p95" + P68 = "p68" + UNSPECIFIED = "unspecified" + + VALUES = [P95, P68, UNSPECIFIED].freeze + end + + # Which position the area result was judged from: the `device` fix, or the connection's `ip` location. + module GeolocationAttemptGeofenceBasis + DEVICE = "device" + IP = "ip" + + VALUES = [DEVICE, IP].freeze + end + + # Where the position sits relative to the rules. `undetermined` means the accuracy circle straddles the border or + # the position resolved to no country; it is not evidence of being outside. + module GeolocationAttemptGeofenceResult + INSIDE = "inside" + OUTSIDE = "outside" + UNDETERMINED = "undetermined" + + VALUES = [INSIDE, OUTSIDE, UNDETERMINED].freeze + end + + # Whether device attestation backs the fix. `unsupported` is what browsers report, because the web has no + # attestation mechanism; it is not a failure. + module GeolocationAttemptIntegrity + ATTESTED = "attested" + NOT_ATTESTED = "not_attested" + FAILED = "failed" + UNSUPPORTED = "unsupported" + NOT_DETERMINED = "not_determined" + + VALUES = [ATTESTED, NOT_ATTESTED, FAILED, UNSUPPORTED, NOT_DETERMINED].freeze + end + + # What happened on this attempt. + module GeolocationAttemptOutcome + VERIFIED = "verified" + LOW_ACCURACY = "low_accuracy" + ACCURACY_UNDETERMINED = "accuracy_undetermined" + STALE = "stale" + APPROXIMATE = "approximate" + DENIED = "denied" + RESTRICTED = "restricted" + UNAVAILABLE = "unavailable" + TIMEOUT = "timeout" + MOCK_DETECTED = "mock_detected" + OUTSIDE_GEOFENCE = "outside_geofence" + IN_BLOCKED_AREA = "in_blocked_area" + ANONYMIZER_DETECTED = "anonymizer_detected" + SKIPPED = "skipped" + REPLAY_REJECTED = "replay_rejected" + UNSUPPORTED_CLIENT = "unsupported_client" + + VALUES = [VERIFIED, LOW_ACCURACY, ACCURACY_UNDETERMINED, STALE, APPROXIMATE, DENIED, RESTRICTED, UNAVAILABLE, TIMEOUT, MOCK_DETECTED, OUTSIDE_GEOFENCE, IN_BLOCKED_AREA, ANONYMIZER_DETECTED, SKIPPED, REPLAY_REJECTED, UNSUPPORTED_CLIENT].freeze + end + + # What the operating system or browser granted. `not_requested` means the step uses the connection's IP location + # only, so the person is never asked for a permission. + module GeolocationAttemptPermission + GRANTED_PRECISE = "granted_precise" + GRANTED_APPROXIMATE = "granted_approximate" + DENIED = "denied" + RESTRICTED = "restricted" + UNAVAILABLE = "unavailable" + TIMEOUT = "timeout" + DISMISSED = "dismissed" + NOT_REQUESTED = "not_requested" + + VALUES = [GRANTED_PRECISE, GRANTED_APPROXIMATE, DENIED, RESTRICTED, UNAVAILABLE, TIMEOUT, DISMISSED, NOT_REQUESTED].freeze + end + + # The client that produced the fix. + module GeolocationAttemptPlatform + WEB = "web" + IOS = "ios" + ANDROID = "android" + REACT_NATIVE = "react_native" + FLUTTER = "flutter" + + VALUES = [WEB, IOS, ANDROID, REACT_NATIVE, FLUTTER].freeze + end + + # Where the step takes the position from, as configured: the device checked against the IP location, the device + # only, or the IP location only. + module GeolocationAttemptPositionSource + DEVICE_AND_IP = "device_and_ip" + DEVICE_ONLY = "device_only" + IP_ONLY = "ip_only" + + VALUES = [DEVICE_AND_IP, DEVICE_ONLY, IP_ONLY].freeze + end + + # Where the fix came from, when the platform says. `ip` means the position is the connection's IP location. + module GeolocationAttemptSource + GPS = "gps" + FUSED = "fused" + NETWORK = "network" + WIFI = "wifi" + CELL = "cell" + BROWSER = "browser" + UNKNOWN = "unknown" + IP = "ip" + + VALUES = [GPS, FUSED, NETWORK, WIFI, CELL, BROWSER, UNKNOWN, IP].freeze + end + + # Feature-level status of this Location verification step, resolved from its warnings. Independent of the session + # `status`. + module GeolocationAttemptStatus + NOT_FINISHED = "Not Finished" + APPROVED = "Approved" + DECLINED = "Declined" + IN_REVIEW = "In Review" + RESUB_REQUESTED = "Resub Requested" + + VALUES = [NOT_FINISHED, APPROVED, DECLINED, IN_REVIEW, RESUB_REQUESTED].freeze + end + + # Confidence level the platform attaches to `accuracy_m`: `p95` (browsers), `p68` (Android) or `unspecified` + # (iOS). + module GeolocationCheckAccuracyConfidence + P95 = "p95" + P68 = "p68" + UNSPECIFIED = "unspecified" + + VALUES = [P95, P68, UNSPECIFIED].freeze + end + + # Which position the area result was judged from: the `device` fix, or the connection's `ip` location. + module GeolocationCheckGeofenceBasis + DEVICE = "device" + IP = "ip" + + VALUES = [DEVICE, IP].freeze + end + + # Where the position sits relative to the rules. `undetermined` means the accuracy circle straddles the border or + # the position resolved to no country; it is not evidence of being outside. + module GeolocationCheckGeofenceResult + INSIDE = "inside" + OUTSIDE = "outside" + UNDETERMINED = "undetermined" + + VALUES = [INSIDE, OUTSIDE, UNDETERMINED].freeze + end + + # Whether device attestation backs the fix. `unsupported` is what browsers report, because the web has no + # attestation mechanism; it is not a failure. + module GeolocationCheckIntegrity + ATTESTED = "attested" + NOT_ATTESTED = "not_attested" + FAILED = "failed" + UNSUPPORTED = "unsupported" + NOT_DETERMINED = "not_determined" + + VALUES = [ATTESTED, NOT_ATTESTED, FAILED, UNSUPPORTED, NOT_DETERMINED].freeze + end + + # What happened on this attempt. + module GeolocationCheckOutcome + VERIFIED = "verified" + LOW_ACCURACY = "low_accuracy" + ACCURACY_UNDETERMINED = "accuracy_undetermined" + STALE = "stale" + APPROXIMATE = "approximate" + DENIED = "denied" + RESTRICTED = "restricted" + UNAVAILABLE = "unavailable" + TIMEOUT = "timeout" + MOCK_DETECTED = "mock_detected" + OUTSIDE_GEOFENCE = "outside_geofence" + IN_BLOCKED_AREA = "in_blocked_area" + ANONYMIZER_DETECTED = "anonymizer_detected" + SKIPPED = "skipped" + REPLAY_REJECTED = "replay_rejected" + UNSUPPORTED_CLIENT = "unsupported_client" + + VALUES = [VERIFIED, LOW_ACCURACY, ACCURACY_UNDETERMINED, STALE, APPROXIMATE, DENIED, RESTRICTED, UNAVAILABLE, TIMEOUT, MOCK_DETECTED, OUTSIDE_GEOFENCE, IN_BLOCKED_AREA, ANONYMIZER_DETECTED, SKIPPED, REPLAY_REJECTED, UNSUPPORTED_CLIENT].freeze + end + + # What the operating system or browser granted. `not_requested` means the step uses the connection's IP location + # only, so the person is never asked for a permission. + module GeolocationCheckPermission + GRANTED_PRECISE = "granted_precise" + GRANTED_APPROXIMATE = "granted_approximate" + DENIED = "denied" + RESTRICTED = "restricted" + UNAVAILABLE = "unavailable" + TIMEOUT = "timeout" + DISMISSED = "dismissed" + NOT_REQUESTED = "not_requested" + + VALUES = [GRANTED_PRECISE, GRANTED_APPROXIMATE, DENIED, RESTRICTED, UNAVAILABLE, TIMEOUT, DISMISSED, NOT_REQUESTED].freeze + end + + # The client that produced the fix. + module GeolocationCheckPlatform + WEB = "web" + IOS = "ios" + ANDROID = "android" + REACT_NATIVE = "react_native" + FLUTTER = "flutter" + + VALUES = [WEB, IOS, ANDROID, REACT_NATIVE, FLUTTER].freeze + end + + # Where the step takes the position from, as configured: the device checked against the IP location, the device + # only, or the IP location only. + module GeolocationCheckPositionSource + DEVICE_AND_IP = "device_and_ip" + DEVICE_ONLY = "device_only" + IP_ONLY = "ip_only" + + VALUES = [DEVICE_AND_IP, DEVICE_ONLY, IP_ONLY].freeze + end + + # Where the fix came from, when the platform says. `ip` means the position is the connection's IP location. + module GeolocationCheckSource + GPS = "gps" + FUSED = "fused" + NETWORK = "network" + WIFI = "wifi" + CELL = "cell" + BROWSER = "browser" + UNKNOWN = "unknown" + IP = "ip" + + VALUES = [GPS, FUSED, NETWORK, WIFI, CELL, BROWSER, UNKNOWN, IP].freeze + end + + # Feature-level status of this Location verification step, resolved from its warnings. Independent of the session + # `status`. + module GeolocationCheckStatus + NOT_FINISHED = "Not Finished" + APPROVED = "Approved" + DECLINED = "Declined" + IN_REVIEW = "In Review" + RESUB_REQUESTED = "Resub Requested" + + VALUES = [NOT_FINISHED, APPROVED, DECLINED, IN_REVIEW, RESUB_REQUESTED].freeze + end + + # The feature that generated this warning. The value identifies the feature block the warning belongs to. Each + # module's warnings array typically uses the value matching its module (e.g. `PHONE` inside + # `phone_verifications[].warnings`), but the enum above is authoritative across all feature warnings on the + # decision payload. + module GeolocationCheckWarningsFeature + ID_VERIFICATION = "ID_VERIFICATION" + NFC = "NFC" + LIVENESS = "LIVENESS" + FACEMATCH = "FACEMATCH" + PROOF_OF_ADDRESS = "PROOF_OF_ADDRESS" + PHONE = "PHONE" + EMAIL = "EMAIL" + AML = "AML" + LOCATION = "LOCATION" + DATABASE_VALIDATION = "DATABASE_VALIDATION" + QUESTIONNAIRE = "QUESTIONNAIRE" + DOCUMENT_AI = "DOCUMENT_AI" + KYB_REGISTRY = "KYB_REGISTRY" + KYB_DOCUMENTS = "KYB_DOCUMENTS" + KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" + + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze + end + # `In Review` when the resolved country conflicts with `claimed_country`, or when the address is associated with # VPN, Tor, or data-center infrastructure. Otherwise `Approved`. module IPRiskResponseIpStatus @@ -1782,6 +2086,31 @@ module KYBKeyPeoplePartyVerificationWorkflowType VALUES = [KYC, KYB, ADAPTIVE_AGE_VERIFICATION, BIOMETRIC_AUTHENTICATION, ADDRESS_VERIFICATION, QUESTIONNAIRE_VERIFICATION, EMAIL_VERIFICATION, PHONE_VERIFICATION].freeze end + # Whether the owner is a natural person or a company. + module KYBOwnershipStructureOwnerEntityType + PERSON = "person" + COMPANY = "company" + + VALUES = [PERSON, COMPANY].freeze + end + + # Why a requested ownership tier was not delivered, in the same codes as `ownership.unavailable_reason`. + # `no_owners_on_record` (the registry answered and names no owner) and `ownership_section_unavailable` (the + # registry did not return the ownership section) are different findings. + module KYBRegistryDataOwnershipError + NO_OWNERS_ON_RECORD = "no_owners_on_record" + NO_NATURAL_PERSON_OWNER = "no_natural_person_owner" + OWNERSHIP_SECTION_UNAVAILABLE = "ownership_section_unavailable" + COMPANY_NOT_FOUND = "company_not_found" + AMBIGUOUS_COMPANY_MATCH = "ambiguous_company_match" + MISSING_REGISTRATION_NUMBER = "missing_registration_number" + ENTITY_TYPE_NOT_COVERED = "entity_type_not_covered" + PROVIDER_UNAVAILABLE = "provider_unavailable" + OTHER = "other" + + VALUES = [NO_OWNERS_ON_RECORD, NO_NATURAL_PERSON_OWNER, OWNERSHIP_SECTION_UNAVAILABLE, COMPANY_NOT_FOUND, AMBIGUOUS_COMPANY_MATCH, MISSING_REGISTRATION_NUMBER, ENTITY_TYPE_NOT_COVERED, PROVIDER_UNAVAILABLE, OTHER].freeze + end + # `delivered` when the registry published ownership; `not_held` when the ownership registry answered and does not # list the company at all (see `unavailable_reason`); `unavailable` when it did not serve the ownership data for # any other reason (see `unavailable_reason`); `pending` while the registry is still fetching it; `not_requested` @@ -1838,6 +2167,13 @@ module KYBRegistrySearchResultsSearchStatus VALUES = [PENDING, RESOLVED].freeze end + # Always `official`. + module KYBRegistrySourceSourceType + OFFICIAL = "official" + + VALUES = [OFFICIAL].freeze + end + # Event category. module MonitoringEventCreateRequestEventCategory AUTH = "auth" @@ -2192,6 +2528,14 @@ module OngoingMonitoringToggleResultStatus VALUES = [PENDING, PROCESSING, COMPLETED, FAILED].freeze end + # Whether the signal raised the risk or added trust. + module PhoneIntelligenceReasonCodesDirection + RISK = "risk" + TRUST = "trust" + + VALUES = [RISK, TRUST].freeze + end + # Decision for this phone number. Mirrors the top-level `status`. module PhoneRiskResponsePhoneStatus APPROVED = "Approved" @@ -2572,8 +2916,19 @@ module SessionDecisionDatabaseValidationsWarningsFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_DOCUMENTS = "KYB_DOCUMENTS" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" + + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze + end + + # Who set the status. `null` while the session is not decided. + module SessionDecisionDecisionTraceDecidedBy + MANUAL = "manual" + AUTOMATIC = "automatic" + INVESTIGATOR = "investigator" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE].freeze + VALUES = [MANUAL, AUTOMATIC, INVESTIGATOR].freeze end # Expected value type of the extracted field. @@ -2680,8 +3035,10 @@ module SessionDecisionEmailVerificationsWarningsFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_DOCUMENTS = "KYB_DOCUMENTS" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE].freeze + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze end # Whether the session was created by a live application (`live`) or a sandbox application (`sandbox`). Sandbox @@ -2746,8 +3103,10 @@ module SessionDecisionFaceMatchesWarningsFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_DOCUMENTS = "KYB_DOCUMENTS" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE].freeze + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze end # Assurance tier derived from `verification_method`: `documentary` for a document that was captured and checked, @@ -2919,8 +3278,10 @@ module SessionDecisionIdVerificationsWarningsFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_DOCUMENTS = "KYB_DOCUMENTS" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE].freeze + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze end # Evidence class of the match: `deterministic` (exact stored or hardware-rooted identifier that cannot collide @@ -2994,8 +3355,10 @@ module SessionDecisionIpAnalysesWarningsFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_DOCUMENTS = "KYB_DOCUMENTS" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE].freeze + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze end # Status of the AML screening run for this beneficial owner. `null` when no AML screening was run. @@ -3297,8 +3660,10 @@ module SessionDecisionLivenessChecksWarningsFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_DOCUMENTS = "KYB_DOCUMENTS" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE].freeze + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze end # Why NFC chip verification did not run, populated whenever the workflow includes an NFC step. `null` while NFC is @@ -3439,8 +3804,10 @@ module SessionDecisionNfcVerificationsWarningsFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_DOCUMENTS = "KYB_DOCUMENTS" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE].freeze + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze end # Where this match came from. `session` means another verification session in your application matched on this @@ -3485,8 +3852,10 @@ module SessionDecisionPhoneVerificationsWarningsFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_DOCUMENTS = "KYB_DOCUMENTS" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE].freeze + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze end # Feature-level status of this Proof of Address step. Independent of the top-level session `status` - a session @@ -3521,8 +3890,10 @@ module SessionDecisionPoaVerificationsWarningsFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_DOCUMENTS = "KYB_DOCUMENTS" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" + GEOLOCATION = "GEOLOCATION" + SIGNATURE = "SIGNATURE" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE].freeze + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, GEOLOCATION, SIGNATURE].freeze end # Known values of an open enum: the API may send others. @@ -3689,6 +4060,18 @@ module SessionEventFeatureStep VALUES = [OCR, OCR_BACK, NFC, AML, FACE, LIVENESS, FACE_MATCH, IP_ANALYSIS, AGE_ESTIMATION, PROOF_OF_ADDRESS, PHONE_VERIFICATION, EMAIL_VERIFICATION, FACE_SEARCH, DATABASE_VALIDATION, QUESTIONNAIRE, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, DOCUMENT_AI, GEOLOCATION].freeze end + # `PENDING` and `PROCESSING` while the ZIP is prepared, `READY` once it can be downloaded, `FAILED` when it could + # not be prepared (request a new export), `EXPIRED` once the ZIP was deleted. + module SessionFilesExportStatus + PENDING = "PENDING" + PROCESSING = "PROCESSING" + READY = "READY" + FAILED = "FAILED" + EXPIRED = "EXPIRED" + + VALUES = [PENDING, PROCESSING, READY, FAILED, EXPIRED].freeze + end + # Known values of an open enum: the API may send others. module SessionImportJobImportType USER_VERIFICATION = "user_verification" @@ -3855,7 +4238,7 @@ module SignatureResultAdoptedSignatureMethod VALUES = [TYPED, DRAWN].freeze end - # Known values of an open enum: the API may send others. + # `null` for a Simple signature, which has no code. module SignatureResultConfirmationChannel EMAIL = "email" SMS = "sms" @@ -3905,19 +4288,21 @@ module SignatureResultDocumentsStatus VALUES = [SIGNED, DECLINED, NOT_SIGNED, NOT_REACHED].freeze end - # Known values of an open enum: the API may send others. + # `pdf` for a Simple signature, `pades` for Advanced (AES). module SignatureResultFormat + PDF = "pdf" PADES = "pades" - VALUES = [PADES].freeze + VALUES = [PDF, PADES].freeze end - # `aes`. `qes` (Qualified Electronic Signature, QES) is coming soon. + # `simple` (default) or `aes`. `qes` (Qualified Electronic Signature, QES) is an add-on that is not available yet. module SignatureResultLevel + SIMPLE = "simple" AES = "aes" QES = "qes" - VALUES = [AES, QES].freeze + VALUES = [SIMPLE, AES, QES].freeze end # Known values of an open enum: the API may send others. @@ -5755,6 +6140,7 @@ module WebhookEvent TRANSACTION_STATUS_UPDATED = "transaction.status.updated" TRAVEL_RULE_STATUS_UPDATED = "travel_rule.status.updated" WORKFLOW_COMPLIANCE_CHANGED = "workflow.compliance_changed" + TRANSACTION_RULE_SUGGESTIONS_CREATED = "transaction_rule_suggestions.created" AUTH_SIGNUP = "auth.signup" AUTH_LOGIN = "auth.login" AUTH_LOGIN_FAILED = "auth.login_failed" @@ -5776,7 +6162,7 @@ module WebhookEvent INVESTIGATOR_QA_FAILED = "investigator.qa.failed" INVESTIGATOR_EXTERNAL_REPORT_READY = "investigator.external.report.ready" - VALUES = [STATUS_UPDATED, DATA_UPDATED, USER_STATUS_UPDATED, USER_DATA_UPDATED, BUSINESS_STATUS_UPDATED, BUSINESS_DATA_UPDATED, ACTIVITY_CREATED, TRANSACTION_CREATED, TRANSACTION_STATUS_UPDATED, TRAVEL_RULE_STATUS_UPDATED, WORKFLOW_COMPLIANCE_CHANGED, AUTH_SIGNUP, AUTH_LOGIN, AUTH_LOGIN_FAILED, AUTH_PASSWORD_RESET_REQUESTED, AUTH_PASSWORD_RESET_COMPLETED, AUTH_MFA_CHANGED, AUTH_NEW_DEVICE, AUTH_ACCOUNT_LOCKED, INVESTIGATOR_REPORT_READY, INVESTIGATOR_DECISION_AUTOMATED, INVESTIGATOR_DECISION_OVERRIDDEN, INVESTIGATOR_DECISION_CONTESTED, INVESTIGATOR_QUESTION_RAISED, INVESTIGATOR_AUTOMATION_PAUSED, INVESTIGATOR_RFI_ANSWERED, INVESTIGATOR_RFI_OVERDUE, INVESTIGATOR_DRIFT_DETECTED, INVESTIGATOR_SLA_BREACHED, INVESTIGATOR_QA_FAILED, INVESTIGATOR_EXTERNAL_REPORT_READY].freeze + VALUES = [STATUS_UPDATED, DATA_UPDATED, USER_STATUS_UPDATED, USER_DATA_UPDATED, BUSINESS_STATUS_UPDATED, BUSINESS_DATA_UPDATED, ACTIVITY_CREATED, TRANSACTION_CREATED, TRANSACTION_STATUS_UPDATED, TRAVEL_RULE_STATUS_UPDATED, WORKFLOW_COMPLIANCE_CHANGED, TRANSACTION_RULE_SUGGESTIONS_CREATED, AUTH_SIGNUP, AUTH_LOGIN, AUTH_LOGIN_FAILED, AUTH_PASSWORD_RESET_REQUESTED, AUTH_PASSWORD_RESET_COMPLETED, AUTH_MFA_CHANGED, AUTH_NEW_DEVICE, AUTH_ACCOUNT_LOCKED, INVESTIGATOR_REPORT_READY, INVESTIGATOR_DECISION_AUTOMATED, INVESTIGATOR_DECISION_OVERRIDDEN, INVESTIGATOR_DECISION_CONTESTED, INVESTIGATOR_QUESTION_RAISED, INVESTIGATOR_AUTOMATION_PAUSED, INVESTIGATOR_RFI_ANSWERED, INVESTIGATOR_RFI_OVERDUE, INVESTIGATOR_DRIFT_DETECTED, INVESTIGATOR_SLA_BREACHED, INVESTIGATOR_QA_FAILED, INVESTIGATOR_EXTERNAL_REPORT_READY].freeze end # Draft versions are editable; published versions are immutable and used for new sessions. @@ -6157,6 +6543,7 @@ class AMLScreeningHitsWarningMatchesAdditionalDataDataCaseDetails < Didit::Model # One completed ongoing-monitoring re-screen of an AML check. class AMLScreeningRun < Didit::Model field :uuid, "uuid", :string + field :run_id, "run_id", :string field :completed_at, "completed_at", :datetime field :started_at, "started_at", :datetime field :outcome, "outcome", :string @@ -6165,6 +6552,8 @@ class AMLScreeningRun < Didit::Model field :status, "status", :string field :score, "score", :float field :total_hits, "total_hits", :integer + field :new_hits, "new_hits", :integer + field :entities_screened, "entities_screened", :integer field :dataset_freshness, "dataset_freshness", "AMLDatasetFreshness" end @@ -6352,6 +6741,27 @@ class ApplicationAnalyticsResubmissionStats < Didit::Model field :abandoned, "abandoned", :integer end + # Today's verifications by local hour against the same weekday last week. + class ApplicationAnalyticsToday < Didit::Model + field :time_zone, "time_zone", :string + field :date, "date", :date + field :current_hour, "current_hour", :integer + field :previous_date, "previous_date", :date + field :hours, "hours", [:array, :integer] + field :previous_hours, "previous_hours", [:array, :integer] + field :total, "total", :integer + field :previous_total_so_far, "previous_total_so_far", :integer + field :outcomes, "outcomes", "ApplicationAnalyticsTodayOutcomes" + end + + # Of today's verifications, how many are approved, waiting in review and declined now. The rest are not finished + # yet. + class ApplicationAnalyticsTodayOutcomes < Didit::Model + field :approved, "approved", :integer + field :in_review, "in_review", :integer + field :declined, "declined", :integer + end + class ApplicationAnalyticsVerificationTimePoint < Didit::Model field :date, "date", :string field :overall_avg, "overall_avg", :float @@ -6617,6 +7027,12 @@ class BankVerificationResultRoute < Didit::Model field :requested_scopes, "requested_scopes", [:array, :string] end + # When the live biometric data of this session is deleted. + class BiometricRetention < Didit::Model + field :jurisdictions, "jurisdictions", [:array, :string] + field :deletes_at, "deletes_at", :datetime + end + # One blocklisted face, identity document, phone number or email address of a verification session. Fields that do # not apply to the item's `type` are `null`. class BlocklistedItem < Didit::Model @@ -7357,6 +7773,11 @@ class DigitalIdWalletApiWalletCatalogResponse < Didit::Model field :wallets, "wallets", [:array, "DigitalIdWalletApiWalletCatalogEntry"] end + class DigitalIdWalletApiWalletDigitalCredentialsRequest < Didit::Model + field :protocol, "protocol", :string + field :request, "request", :any + end + class DigitalIdWalletApiWalletIdentity < Didit::Model field :full_name, "full_name", :string field :first_name, "first_name", :string @@ -7369,6 +7790,7 @@ class DigitalIdWalletApiWalletIdentity < Didit::Model class DigitalIdWalletApiWalletNextAction < Didit::Model field :type, "type", :string field :url, "url", :string + field :digital_credentials, "digital_credentials", "DigitalIdWalletApiWalletDigitalCredentialsRequest" field :verification_code, "verification_code", :string field :poll_interval_seconds, "poll_interval_seconds", :integer end @@ -7427,7 +7849,15 @@ class EmailIntelligence < Didit::Model field :is_free_domain, "is_free_domain", :boolean field :is_breached, "is_breached", :boolean field :no_of_breaches, "no_of_breaches", :float - field :reason_codes, "reason_codes", [:array, :string] + field :reason_codes, "reason_codes", [:array, "EmailIntelligenceReasonCodes"] + end + + class EmailIntelligenceReasonCodes < Didit::Model + field :code, "code", :string + field :value, "value", :any + field :direction, "direction", :string + field :message, "message", :string + field :impact_level, "impact_level", :string end # Another session of your application that used the same email address with a different `vendor_data`. @@ -7530,6 +7960,7 @@ class EmailVerificationCheckResponseEmail < Didit::Model field :lifecycle, "lifecycle", [:array, "EmailVerificationCheckResponseEmailLifecycle"] field :matches, "matches", [:array, "EmailVerificationCheckResponseEmailMatches"] field :email_social, "email_social", "EmailSocialFootprint" + field :email_intelligence, "email_intelligence", "EmailIntelligence" end class EmailVerificationCheckResponseEmailBreaches < Didit::Model @@ -7700,6 +8131,141 @@ class FraudCheckRisk < Didit::Model field :evidence_indexes, "evidence_indexes", [:array, :integer] end + # One attempt of a Location verification step: the same keys as `geolocation_checks[]` except `warnings`, plus + # when Didit received it. + class GeolocationAttempt < Didit::Model + field :node_id, "node_id", :string + field :status, "status", :string + field :outcome, "outcome", :string + field :permission, "permission", :string + field :latitude, "latitude", :float + field :longitude, "longitude", :float + field :accuracy_m, "accuracy_m", :float + field :accuracy_confidence, "accuracy_confidence", :string + field :measured_at, "measured_at", :datetime + field :age_seconds, "age_seconds", :integer + field :source, "source", :string + field :platform, "platform", :string + field :sdk_version, "sdk_version", :string + field :is_mock, "is_mock", :boolean + field :produced_by_accessory, "produced_by_accessory", :boolean + field :integrity, "integrity", :string + field :country_code, "country_code", :string + field :region_code, "region_code", :string + field :city, "city", :string + field :geofence, "geofence", "GeolocationAttemptGeofence" + field :inside_geofence, "inside_geofence", :boolean + field :geofence_basis, "geofence_basis", :string + field :inside_areas, "inside_areas", [:array, :string] + field :blocked_areas, "blocked_areas", [:array, :string] + field :position_source, "position_source", :string + field :anonymizers, "anonymizers", "GeolocationAttemptAnonymizers" + field :ip_distance_km, "ip_distance_km", :float + field :ip_distance_uncertainty_km, "ip_distance_uncertainty_km", :float + field :ip_consistent, "ip_consistent", :boolean + field :document_distance_km, "document_distance_km", :float + field :travel_excused, "travel_excused", :boolean + field :consecutive_mismatches, "consecutive_mismatches", :integer + field :attempts, "attempts", :integer + field :consent, "consent", "GeolocationAttemptConsent" + field :received_at, "received_at", :datetime + field :created_at, "created_at", :datetime + end + + # What the connection and device look like, each `true`, `false` or `null` when the source cannot tell. + class GeolocationAttemptAnonymizers < Didit::Model + field :vpn, "vpn", :boolean + field :proxy, "proxy", :boolean + field :tor, "tor", :boolean + field :spoofing, "spoofing", :boolean + field :emulator, "emulator", :boolean + end + + # The consent the person gave before the system prompt, recorded with the wording version and language they saw. + class GeolocationAttemptConsent < Didit::Model + field :accepted_at, "accepted_at", :datetime + field :version, "version", :string + field :locale, "locale", :string + end + + # Result of the country and area rules of the step. + class GeolocationAttemptGeofence < Didit::Model + field :enabled, "enabled", :boolean + field :result, "result", :string + end + + # One Location verification result, the accepted attempt of one workflow node. Measurement, uncertainty and + # authenticity are separate keys, so a precise unattested fix reads differently from an imprecise attested one. + class GeolocationCheck < Didit::Model + field :node_id, "node_id", :string + field :status, "status", :string + field :outcome, "outcome", :string + field :permission, "permission", :string + field :latitude, "latitude", :float + field :longitude, "longitude", :float + field :accuracy_m, "accuracy_m", :float + field :accuracy_confidence, "accuracy_confidence", :string + field :measured_at, "measured_at", :datetime + field :age_seconds, "age_seconds", :integer + field :source, "source", :string + field :platform, "platform", :string + field :sdk_version, "sdk_version", :string + field :is_mock, "is_mock", :boolean + field :produced_by_accessory, "produced_by_accessory", :boolean + field :integrity, "integrity", :string + field :country_code, "country_code", :string + field :region_code, "region_code", :string + field :city, "city", :string + field :geofence, "geofence", "GeolocationCheckGeofence" + field :inside_geofence, "inside_geofence", :boolean + field :geofence_basis, "geofence_basis", :string + field :inside_areas, "inside_areas", [:array, :string] + field :blocked_areas, "blocked_areas", [:array, :string] + field :position_source, "position_source", :string + field :anonymizers, "anonymizers", "GeolocationCheckAnonymizers" + field :ip_distance_km, "ip_distance_km", :float + field :ip_distance_uncertainty_km, "ip_distance_uncertainty_km", :float + field :ip_consistent, "ip_consistent", :boolean + field :document_distance_km, "document_distance_km", :float + field :travel_excused, "travel_excused", :boolean + field :consecutive_mismatches, "consecutive_mismatches", :integer + field :attempts, "attempts", :integer + field :consent, "consent", "GeolocationCheckConsent" + field :warnings, "warnings", [:array, "GeolocationCheckWarnings"] + end + + # What the connection and device look like, each `true`, `false` or `null` when the source cannot tell. + class GeolocationCheckAnonymizers < Didit::Model + field :vpn, "vpn", :boolean + field :proxy, "proxy", :boolean + field :tor, "tor", :boolean + field :spoofing, "spoofing", :boolean + field :emulator, "emulator", :boolean + end + + # The consent the person gave before the system prompt, recorded with the wording version and language they saw. + class GeolocationCheckConsent < Didit::Model + field :accepted_at, "accepted_at", :datetime + field :version, "version", :string + field :locale, "locale", :string + end + + # Result of the country and area rules of the step. + class GeolocationCheckGeofence < Didit::Model + field :enabled, "enabled", :boolean + field :result, "result", :string + end + + class GeolocationCheckWarnings < Didit::Model + field :feature, "feature", :string + field :risk, "risk", :string + field :additional_data, "additional_data", :any + field :log_type, "log_type", :string + field :short_description, "short_description", :string + field :long_description, "long_description", :string + field :node_id, "node_id", :string + end + class IPRiskResponse < Didit::Model field :request_id, "request_id", :string field :status, "status", :string @@ -7967,6 +8533,37 @@ class KYBKeyPeoplePartyVerificationWorkflowFeatures < Didit::Model field :status, "status", :string end + # The cap table the registry proved, as it stood when the ownership tier was delivered: direct `shareholders` and + # `beneficial_owners`. Null when the registry proved no ownership. It never carries the registry source's own + # rows; read `company.beneficial_owners` and `company.ownership` for the current record. + class KYBOwnershipStructure < Didit::Model + field :shareholders, "shareholders", [:array, "KYBOwnershipStructureOwner"] + field :beneficial_owners, "beneficial_owners", [:array, "KYBOwnershipStructureOwner"] + end + + # One owner of the ownership snapshot: the same registry identity and stake as `company.beneficial_owners[]`, and + # its canonical `shareholding`. + class KYBOwnershipStructureOwner < Didit::Model + field :name, "name", :string + field :first_name, "first_name", :string + field :last_name, "last_name", :string + field :date_of_birth, "date_of_birth", :string + field :country_of_birth, "country_of_birth", :string + field :company_name, "company_name", :string + field :registration_number, "registration_number", :string + field :entity_type, "entity_type", :string + field :nationality, "nationality", :string + field :designation, "designation", :string + field :roles, "roles", [:array, :string] + field :ownership_min_shares, "ownership_min_shares", :string + field :ownership_max_shares, "ownership_max_shares", :string + field :voting_min_shares, "voting_min_shares", :string + field :voting_max_shares, "voting_max_shares", :string + field :appointment_date, "appointment_date", :string + field :is_active, "is_active", :boolean + field :shareholding, "shareholding", "KYBRegistryShareholding" + end + # An address the registry states, in the same shape for every country and registry source. Every key is always # present; a part the registry does not publish is null. class KYBRegistryAddress < Didit::Model @@ -7980,6 +8577,55 @@ class KYBRegistryAddress < Didit::Model field :description, "description", :string end + # Didit's normalized registry detail for the company: the ownership outcome (`ownership_error`, `section_errors`, + # `ubo_resolution`, `lite_enrichment`), the corrections made with update-data, and registry facts that have no + # field of their own. It never carries the registry source's own record. Every key is optional and present only + # when the company has a value for it; new keys may be added. Read the canonical fields (`addresses`, + # `industries`, `ownership`, `beneficial_owners[].shareholding`) for anything they cover. + class KYBRegistryData < Didit::Model + field :company_name, "company_name", :string + field :registration_number, "registration_number", :string + field :country_code, "country_code", :string + field :region, "region", :string + field :incorporation_date, "incorporation_date", :string + field :registration_date, "registration_date", :string + field :dissolution_date, "dissolution_date", :string + field :tax_number, "tax_number", :string + field :vat_number, "vat_number", :string + field :legal_address, "legal_address", :string + field :registered_address, "registered_address", :string + field :company_type, "company_type", :string + field :registry_status, "registry_status", :string + field :verification_status, "verification_status", :string + field :alternative_names, "alternative_names", :string + field :nature_of_business, "nature_of_business", :string + field :registered_capital, "registered_capital", :string + field :registered_capital_amount, "registered_capital_amount", :string + field :registered_capital_currency, "registered_capital_currency", :string + field :website, "website", :string + field :email, "email", :string + field :phone, "phone", :string + field :legal_entity_identifier, "legal_entity_identifier", :string + field :location_of_registration, "location_of_registration", :string + field :control_scheme, "control_scheme", :string + field :ownership_error, "ownership_error", :string + field :section_errors, "section_errors", [:map, "KYBRegistrySectionError"] + field :ubo_resolution, "ubo_resolution", "KYBRegistryUboResolution" + field :lite_enrichment, "lite_enrichment", "KYBRegistryLiteEnrichment" + field :registry_metadata, "registry_metadata", [:map, [:union, [:string, :float, :boolean]]] + field :registry_sources, "registry_sources", [:array, "KYBRegistrySource"] + field :previous_names, "previous_names", [:array, :string] + field :parent_companies, "parent_companies", [:array, :string] + field :documents_available, "documents_available", :integer + end + + # A company of the corporate group, by its registry identity. + class KYBRegistryGroupCompany < Didit::Model + field :name, "name", :string + field :country_code, "country_code", :string + field :registration_number, "registration_number", :string + end + # An activity the registry classifies the company under, in the same shape for every country and registry source. class KYBRegistryIndustry < Didit::Model field :code, "code", :string @@ -7988,6 +8634,12 @@ class KYBRegistryIndustry < Didit::Model field :is_primary, "is_primary", :boolean end + # Blank Lite profile fields another of the country's registry sources filled. The source is not named. + class KYBRegistryLiteEnrichment < Didit::Model + field :fields, "fields", [:array, :string] + field :people_added, "people_added", :integer + end + # The outcome of the ownership (Shareholders / UBO) tier, in the same shape for every country and registry source. class KYBRegistryOwnership < Didit::Model field :status, "status", :string @@ -8027,6 +8679,11 @@ class KYBRegistrySearchResultsPagination < Didit::Model field :per_page, "per_page", :integer end + # A section the registry did not return. + class KYBRegistrySectionError < Didit::Model + field :status_code, "status_code", :integer + end + # What an owner holds, in the same shape for every country and registry source. Null when the registry states no # holding. A band (for example a UK PSC's 25-50%) is not a stake: `percentage` is null and the band stays in # `ownership_min_shares` / `ownership_max_shares`. @@ -8039,6 +8696,25 @@ class KYBRegistryShareholding < Didit::Model field :percentage, "percentage", :float end + # An official register the record was read from. Only official government registers, regulators and the official + # identifier system are named; any other source is left out. + class KYBRegistrySource < Didit::Model + field :name, "name", :string + field :source_type, "source_type", :string + end + + # How the UBO tier walked the ownership chain above the company. + class KYBRegistryUboResolution < Didit::Model + field :parent_chain, "parent_chain", [:array, "KYBRegistryGroupCompany"] + field :subsidiaries, "subsidiaries", [:array, "KYBRegistryGroupCompany"] + field :unresolved, "unresolved", [:array, "KYBRegistryUboResolutionUnresolved"] + end + + class KYBRegistryUboResolutionUnresolved < Didit::Model + field :reason, "reason", :string + field :section, "section", :string + end + # One stored monitoring event as returned by the list and subject-timeline endpoints. Restricted evidence # (payload, device context, rule evidence) is only returned by `GET /v3/events/{event_uuid}/`. class MonitoringEvent < Didit::Model @@ -8564,7 +9240,15 @@ class PhoneIntelligence < Didit::Model field :is_ported, "is_ported", :boolean field :is_recently_ported, "is_recently_ported", :boolean field :carrier_type, "carrier_type", :string - field :reason_codes, "reason_codes", [:array, :string] + field :reason_codes, "reason_codes", [:array, "PhoneIntelligenceReasonCodes"] + end + + class PhoneIntelligenceReasonCodes < Didit::Model + field :code, "code", :string + field :value, "value", :any + field :direction, "direction", :string + field :message, "message", :string + field :impact_level, "impact_level", :string end # Another session of your application that used the same phone number with a different `vendor_data`. @@ -8670,6 +9354,7 @@ class PhoneVerificationCheckResponsePhone < Didit::Model field :lifecycle, "lifecycle", [:array, "PhoneVerificationCheckResponsePhoneLifecycle"] field :matches, "matches", [:array, "PhoneVerificationCheckResponsePhoneMatches"] field :phone_social, "phone_social", "PhoneSocialFootprint" + field :phone_intelligence, "phone_intelligence", "PhoneIntelligence" end # Current network serving the number, from the carrier lookup run at finalization. @@ -8919,9 +9604,13 @@ class SessionDecision < Didit::Model field :session_id, "session_id", :string field :session_kind, "session_kind", :string field :shared_from_session, "shared_from_session", :string + field :shared_from_session_number, "shared_from_session_number", :integer field :session_number, "session_number", :integer field :session_url, "session_url", :string field :status, "status", :string + field :status_override, "status_override", "SessionDecisionStatusOverride" + field :decision_trace, "decision_trace", "SessionDecisionDecisionTrace" + field :linked_records, "linked_records", "SessionDecisionLinkedRecords" field :workflow_id, "workflow_id", :string field :features, "features", [:array, :string] field :vendor_data, "vendor_data", :string @@ -8943,17 +9632,34 @@ class SessionDecision < Didit::Model field :signatures, "signatures", [:array, "SignatureResult"] field :aml_screenings, "aml_screenings", [:array, "AMLScreening"] field :ip_analyses, "ip_analyses", [:array, "SessionDecisionIpAnalyses"] + field :geolocation_checks, "geolocation_checks", [:array, "GeolocationCheck"] + field :geolocation_attempts, "geolocation_attempts", [:array, "GeolocationAttempt"] field :database_validations, "database_validations", [:array, "SessionDecisionDatabaseValidations"] + field :database_validation_not_performed_reason, "database_validation_not_performed_reason", "SessionDecisionDatabaseValidationNotPerformedReason" field :reviews, "reviews", [:array, "SessionDecisionReviews"] + field :assignee, "assignee", "SessionDecisionAssignee" + field :waiting_since, "waiting_since", :datetime + field :sla_due_at, "sla_due_at", :datetime field :created_at, "created_at", :datetime field :expires_at, "expires_at", :datetime field :registry_checks, "registry_checks", [:array, "SessionDecisionRegistryChecks"] field :key_people_checks, "key_people_checks", [:array, "SessionDecisionKeyPeopleChecks"] field :document_verifications, "document_verifications", [:array, "SessionDecisionDocumentVerifications"] field :environment, "environment", :string + field :sandbox_scenario, "sandbox_scenario", :string field :resubmissions, "resubmissions", [:array, "SessionDecisionResubmissions"] field :biometric_consent, "biometric_consent", "SessionDecisionBiometricConsent" field :investigator, "investigator", "InvestigatorBlock" + field :biometric_retention, "biometric_retention", "BiometricRetention" + field :fraud_check, "fraud_check", :any + field :full_session_video, "full_session_video", :string + field :full_session_video_recorded_at, "full_session_video_recorded_at", :datetime + end + + # The Console reviewer the session is assigned to, or `null` when nobody holds it. + class SessionDecisionAssignee < Didit::Model + field :email, "email", :string + field :assigned_at, "assigned_at", :datetime end # Whether the session required explicit biometric consent before a face capture, why, and the evidence of the @@ -9001,6 +9707,14 @@ class SessionDecisionContactDetails < Didit::Model field :phone, "phone", :string end + # Why a configured database validation produced no result, as `{code, message}` plus context fields. Present only + # when `database_validations` is `null` for a workflow that has the step, so you can tell "the registry agreed" + # from "nothing ran". `null` otherwise. + class SessionDecisionDatabaseValidationNotPerformedReason < Didit::Model + field :code, "code", :string + field :message, "message", :string + end + class SessionDecisionDatabaseValidations < Didit::Model field :node_id, "node_id", :string field :issuing_state, "issuing_state", :string @@ -9058,6 +9772,34 @@ class SessionDecisionDatabaseValidationsWarnings < Didit::Model field :node_id, "node_id", :string end + # How the status was reached: who set it and which warnings did. + class SessionDecisionDecisionTrace < Didit::Model + field :status, "status", :string + field :decided_by, "decided_by", :string + field :decided_at, "decided_at", :datetime + field :automatic_status, "automatic_status", :string + field :terminal_node_id, "terminal_node_id", :string + field :actor, "actor", "SessionDecisionDecisionTraceActor" + field :warning_counts, "warning_counts", [:map, :integer] + field :status_warnings, "status_warnings", [:array, "SessionDecisionDecisionTraceStatusWarnings"] + end + + # The reviewer behind a manual decision. + class SessionDecisionDecisionTraceActor < Didit::Model + field :user, "user", :string + field :actor_type, "actor_type", :string + end + + class SessionDecisionDecisionTraceStatusWarnings < Didit::Model + field :risk, "risk", :string + field :feature, "feature", :string + field :node_id, "node_id", :string + field :log_type, "log_type", :string + field :check_status, "check_status", :string + field :source, "source", :string + field :short_description, "short_description", :string + end + # Document AI results grouped by workflow node. class SessionDecisionDocumentAiDocuments < Didit::Model field :status, "status", :string @@ -9183,6 +9925,8 @@ class SessionDecisionEmailVerifications < Didit::Model field :warnings, "warnings", [:array, "SessionDecisionEmailVerificationsWarnings"] field :lifecycle, "lifecycle", [:array, "SessionDecisionEmailVerificationsLifecycle"] field :matches, "matches", [:array, "SessionDecisionEmailVerificationsMatches"] + field :email_intelligence, "email_intelligence", "EmailIntelligence" + field :email_social, "email_social", "EmailSocialFootprint" end class SessionDecisionEmailVerificationsBreaches < Didit::Model @@ -9265,6 +10009,34 @@ class SessionDecisionFaceMatches < Didit::Model field :source_image, "source_image", :string field :target_image, "target_image", :string field :warnings, "warnings", [:array, "SessionDecisionFaceMatchesWarnings"] + field :face_coverage, "face_coverage", "SessionDecisionFaceMatchesFaceCoverage" + end + + # Whether the eyes, mouth and face are covered in the captured image. Returned by `GET + # /v3/session/{sessionId}/decision/` only; it is not part of webhook payloads. `null` when no coverage reading + # exists. + class SessionDecisionFaceMatchesFaceCoverage < Didit::Model + field :eyes, "eyes", "SessionDecisionFaceMatchesFaceCoverageEyes" + field :mouth, "mouth", "SessionDecisionFaceMatchesFaceCoverageMouth" + field :face, "face", "SessionDecisionFaceMatchesFaceCoverageFace" + end + + class SessionDecisionFaceMatchesFaceCoverageEyes < Didit::Model + field :covered, "covered", :boolean + field :calibrated, "calibrated", :boolean + field :visibility_score, "visibility_score", :float + end + + class SessionDecisionFaceMatchesFaceCoverageFace < Didit::Model + field :covered, "covered", :boolean + field :calibrated, "calibrated", :boolean + field :visibility_score, "visibility_score", :float + end + + class SessionDecisionFaceMatchesFaceCoverageMouth < Didit::Model + field :covered, "covered", :boolean + field :calibrated, "calibrated", :boolean + field :visibility_score, "visibility_score", :float end class SessionDecisionFaceMatchesWarnings < Didit::Model @@ -9330,6 +10102,9 @@ class SessionDecisionIdVerifications < Didit::Model field :matches, "matches", [:array, "SessionDecisionIdVerificationsMatches"] field :document_liveness, "document_liveness", "SessionDecisionIdVerificationsDocumentLiveness" field :address_validation, "address_validation", "AddressValidationResult" + field :region, "region", :string + field :extracted_data, "extracted_data", :any + field :barcodes, "barcodes", [:array, :any] end # Quality metrics for the back document image. Same structure as front_image_quality_score. @@ -9638,6 +10413,14 @@ class SessionDecisionIpAnalyses < Didit::Model field :poa_document, "poa_document", "SessionDecisionIpAnalysesPoaDocument" field :warnings, "warnings", [:array, "SessionDecisionIpAnalysesWarnings"] field :matches, "matches", [:array, "SessionDecisionIpAnalysesMatches"] + field :browser_version, "browser_version", :string + field :os_version, "os_version", :string + field :user_agent, "user_agent", :string + field :accept_language, "accept_language", :string + field :session_identifier, "session_identifier", :string + field :session_age_ms, "session_age_ms", :integer + field :coords_accuracy, "coords_accuracy", :float + field :raw_device_data, "raw_device_data", :any end # Location extracted from the ID document address plus distances (km) to the IP geolocation and the POA document @@ -9905,6 +10688,47 @@ class SessionDecisionKeyPeopleChecksUboKycSummary < Didit::Model field :pending, "pending", :integer end + # A summary of other records linked to the session. `null` when there is nothing to show, and for workflows that + # declare an age assurance standard. + class SessionDecisionLinkedRecords < Didit::Model + field :same_face, "same_face", "SessionDecisionLinkedRecordsSameFace" + field :earlier_verifications, "earlier_verifications", "SessionDecisionLinkedRecordsEarlierVerifications" + field :networks, "networks", "SessionDecisionLinkedRecordsNetworks" + end + + class SessionDecisionLinkedRecordsEarlierVerifications < Didit::Model + field :count, "count", :integer + field :vendor_user_id, "vendor_user_id", :string + end + + class SessionDecisionLinkedRecordsNetworks < Didit::Model + field :count, "count", :integer + field :open, "open", :integer + field :dismissed, "dismissed", :integer + field :items, "items", [:array, "SessionDecisionLinkedRecordsNetworksItems"] + end + + class SessionDecisionLinkedRecordsNetworksItems < Didit::Model + field :network_id, "network_id", :string + field :display_number, "display_number", :integer + field :name, "name", :string + field :status, "status", :string + field :risk_score, "risk_score", :float + end + + # Other people whose face matched one of this session's face searches. + class SessionDecisionLinkedRecordsSameFace < Didit::Model + field :count, "count", :integer + field :best_match, "best_match", "SessionDecisionLinkedRecordsSameFaceBestMatch" + end + + class SessionDecisionLinkedRecordsSameFaceBestMatch < Didit::Model + field :session_id, "session_id", :string + field :session_number, "session_number", :integer + field :vendor_user_id, "vendor_user_id", :string + field :similarity_percentage, "similarity_percentage", :float + end + # One liveness report - the full report for a single liveness pass. class SessionDecisionLivenessChecks < Didit::Model field :node_id, "node_id", :string @@ -10071,6 +10895,8 @@ class SessionDecisionPhoneVerifications < Didit::Model field :lifecycle, "lifecycle", [:array, "SessionDecisionPhoneVerificationsLifecycle"] field :warnings, "warnings", [:array, "SessionDecisionPhoneVerificationsWarnings"] field :matches, "matches", [:array, "SessionDecisionPhoneVerificationsMatches"] + field :phone_intelligence, "phone_intelligence", "PhoneIntelligence" + field :phone_social, "phone_social", "PhoneSocialFootprint" end class SessionDecisionPhoneVerificationsCarrier < Didit::Model @@ -10282,7 +11108,7 @@ class SessionDecisionRegistryChecks < Didit::Model field :node_id, "node_id", :string field :data_resolved, "data_resolved", :boolean field :company, "company", "SessionDecisionRegistryChecksCompany" - field :ownership_structure, "ownership_structure", :any + field :ownership_structure, "ownership_structure", "KYBOwnershipStructure" field :warnings, "warnings", [:array, :any] end @@ -10328,7 +11154,7 @@ class SessionDecisionRegistryChecksCompany < Didit::Model field :addresses, "addresses", [:array, "KYBRegistryAddress"] field :industries, "industries", [:array, "KYBRegistryIndustry"] field :accounts, "accounts", :any - field :registry_data, "registry_data", :any + field :registry_data, "registry_data", "KYBRegistryData" field :user_provided_data, "user_provided_data", :any field :confirmed_by_user_at, "confirmed_by_user_at", :datetime field :last_console_edit_at, "last_console_edit_at", :datetime @@ -10337,6 +11163,7 @@ class SessionDecisionRegistryChecksCompany < Didit::Model field :registry_tier, "registry_tier", :string field :registry_tier_delivered, "registry_tier_delivered", :string field :registry_ownership_status, "registry_ownership_status", :string + field :registry_monitoring, "registry_monitoring", "SessionDecisionRegistryChecksCompanyRegistryMonitoring" end class SessionDecisionRegistryChecksCompanyBeneficialOwners < Didit::Model @@ -10384,6 +11211,20 @@ class SessionDecisionRegistryChecksCompanyOfficers < Didit::Model field :date_of_birth_month, "date_of_birth_month", :integer end + # The latest registry monitor for the company, or `null` when none exists. + class SessionDecisionRegistryChecksCompanyRegistryMonitoring < Didit::Model + field :uuid, "uuid", :string + field :status, "status", :string + field :unavailable_reason, "unavailable_reason", :string + field :enrolled_at, "enrolled_at", :datetime + field :cancelled_at, "cancelled_at", :datetime + field :last_bill_date, "last_bill_date", :date + field :next_bill_date, "next_bill_date", :date + field :last_event_at, "last_event_at", :datetime + field :events_count, "events_count", :integer + field :watched_fields, "watched_fields", :any + end + class SessionDecisionResubmissions < Didit::Model field :number, "number", :integer field :created_at, "created_at", :datetime @@ -10413,6 +11254,13 @@ class SessionDecisionReviews < Didit::Model field :created_at, "created_at", :datetime end + # Present when a reviewer set `status` by hand. `null` when the status is the automatic one. Use it to tell a + # manual approval from an automatic one. + class SessionDecisionStatusOverride < Didit::Model + field :overridden_at, "overridden_at", :datetime + field :automatic_status, "automatic_status", :string + end + # A bulk session deletion running in the background: progress and counts per outcome, never which sessions it # deleted. class SessionDeletionJob < Didit::Model @@ -10453,6 +11301,20 @@ class SessionEvent < Didit::Model field :sent_at, "sent_at", :integer end + # One ZIP with every file of a session, in original quality. + class SessionFilesExport < Didit::Model + field :export_id, "export_id", :string + field :session_id, "session_id", :string + field :status, "status", :string + field :file_count, "file_count", :integer + field :size_bytes, "size_bytes", :integer + field :download_url, "download_url", :string + field :expires_at, "expires_at", :datetime + field :error, "error", :string + field :created_at, "created_at", :datetime + field :completed_at, "completed_at", :datetime + end + class SessionImportError < Didit::Model field :uuid, "uuid", :string field :row_number, "row_number", :integer @@ -10537,7 +11399,7 @@ class SignatureFieldResult < Didit::Model field :value_unavailable_reason, "value_unavailable_reason", :string end - # One signer's result for one Electronic Signature step. See the [Electronic Signature + # One signer's result for one E-signature step. See the [E-signature # report](/core-technology/electronic-signature/report-electronic-signature). class SignatureResult < Didit::Model field :id, "id", :string @@ -10577,7 +11439,7 @@ class SignatureResultAdoptedSignature < Didit::Model field :adopted_at, "adopted_at", :datetime end - # The certificate the documents were signed with. `null` until signed. + # The certificate the documents were signed with. `null` until signed, and always `null` for a Simple signature. class SignatureResultCertificate < Didit::Model field :issuer, "issuer", :string field :issued_to, "issued_to", :string @@ -10624,6 +11486,7 @@ class SignatureResultDocumentsConversion < Didit::Model field :converter, "converter", :string end + # The verified identity the signature relies on. Empty for a Simple signature with no verified identity. class SignatureResultIdentityUsed < Didit::Model field :session_id, "session_id", :string field :kyc_id, "kyc_id", :string @@ -10640,7 +11503,8 @@ class SignatureResultSigner < Didit::Model field :identity_session_id, "identity_session_id", :string end - # The trusted timestamp in the signature. `null` until signed. + # The RFC 3161 timestamp in the signature, issued by Didit. `null` until signed, and always `null` for a Simple + # signature. class SignatureResultTimestamp < Didit::Model field :time, "time", :datetime field :qualified, "qualified", :boolean @@ -10669,7 +11533,7 @@ class SignatureResultValidationDocuments < Didit::Model field :timestamp, "timestamp", "SignatureResultValidationDocumentsTimestamp" end - # The certificate the documents were signed with. `null` until signed. + # The certificate the documents were signed with. `null` until signed, and always `null` for a Simple signature. class SignatureResultValidationDocumentsCertificate < Didit::Model field :issuer, "issuer", :string field :issued_to, "issued_to", :string @@ -10678,7 +11542,8 @@ class SignatureResultValidationDocumentsCertificate < Didit::Model field :valid_until, "valid_until", :datetime end - # The trusted timestamp in the signature. `null` until signed. + # The RFC 3161 timestamp in the signature, issued by Didit. `null` until signed, and always `null` for a Simple + # signature. class SignatureResultValidationDocumentsTimestamp < Didit::Model field :time, "time", :datetime field :qualified, "qualified", :boolean @@ -11334,6 +12199,11 @@ class TravelRuleInboundResponse < Didit::Model field :travel_rule, "travel_rule", "TravelRuleTransferDetail" end + class TravelRuleManualMatchResponse < Didit::Model + field :deposit, "deposit", "TravelRuleTransferRow" + field :message, "message", "TravelRuleTransferRow" + end + # How strictly each field of the counterparty's data is compared with what you hold, per entity type. A field you # leave out keeps its default. `NONE` skips the comparison, `STRICT` needs exactly the same words, `CONTAINS` # accepts one value whose words all appear in the other, `DEFAULT` is the standard subset match, and `FUZZY` @@ -12086,6 +12956,7 @@ class WebhookConfig < Didit::Model field :available_events, "available_events", [:array, "WebhookConfigAvailableEvents"] field :allowed_return_hosts, "allowed_return_hosts", [:array, :string] field :endpoints, "endpoints", [:array, "WebhookConfigDestination"] + field :allowed_domains, "allowed_domains", [:array, :string] end class WebhookConfigAvailableEvents < Didit::Model @@ -12163,12 +13034,21 @@ class WorkflowDetail < Didit::Model field :kyb_role_settings, "kyb_role_settings", [:array, :any] field :created_at, "created_at", :datetime field :updated_at, "updated_at", :datetime + field :signature_availability, "signature_availability", "WorkflowDetailSignatureAvailability" field :is_bank_verification_enabled, "is_bank_verification_enabled", :boolean field :bank_verification_config, "bank_verification_config", :any field :is_geolocation_enabled, "is_geolocation_enabled", :boolean field :geolocation_config, "geolocation_config", :any end + # Which E-signature levels can sign right now. Check it before you set `signature_level`. Returned on `kyc`, `kyb` + # and graph workflows. + class WorkflowDetailSignatureAvailability < Didit::Model + field :simple, "simple", :boolean + field :aes, "aes", :boolean + field :qes, "qes", :boolean + end + # One workflow version in the list view. class WorkflowListItem < Didit::Model field :uuid, "uuid", :string diff --git a/lib/didit/types/email.rb b/lib/didit/types/email.rb index 6656caf..9ef966d 100644 --- a/lib/didit/types/email.rb +++ b/lib/didit/types/email.rb @@ -31,6 +31,16 @@ module EmailCheckCodeParamsDuplicatedEmailAction VALUES = [NO_ACTION, DECLINE].freeze end + # Action when the email intelligence risk score is above the threshold. `DECLINE` flips the final `status` to + # `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is + # `true`. + module EmailCheckCodeParamsEmailIntelligenceScoreAction + NO_ACTION = "NO_ACTION" + DECLINE = "DECLINE" + + VALUES = [NO_ACTION, DECLINE].freeze + end + # Action when the social footprint check finds the address registered on none of the platforms it covers. Only # NO_ACTION and DECLINE are accepted on this endpoint; REVIEW is available on the workflow configuration key of # the same name. @@ -41,6 +51,24 @@ module EmailCheckCodeParamsEmailNoSocialPresenceAction VALUES = [NO_ACTION, DECLINE].freeze end + # Action when the address appears in many known data breaches. `DECLINE` flips the final `status` to `Declined`; + # `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is `true`. + module EmailCheckCodeParamsFrequentEmailBreachAction + NO_ACTION = "NO_ACTION" + DECLINE = "DECLINE" + + VALUES = [NO_ACTION, DECLINE].freeze + end + + # Action when the address appears in a recent known data breach. `DECLINE` flips the final `status` to `Declined`; + # `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is `true`. + module EmailCheckCodeParamsRecentEmailBreachAction + NO_ACTION = "NO_ACTION" + DECLINE = "DECLINE" + + VALUES = [NO_ACTION, DECLINE].freeze + end + # Language of the OTP email template. Defaults to `en`. Unsupported values return `400` listing all supported # locales. module EmailSendCodeParamsOptionsLocale diff --git a/lib/didit/types/kyb.rb b/lib/didit/types/kyb.rb index 4b35637..6a11b8f 100644 --- a/lib/didit/types/kyb.rb +++ b/lib/didit/types/kyb.rb @@ -902,7 +902,7 @@ class KybListShareholdersResponse202KybRegistry < Didit::Model field :addresses, "addresses", [:array, "KYBRegistryAddress"] field :industries, "industries", [:array, "KYBRegistryIndustry"] field :accounts, "accounts", :any - field :registry_data, "registry_data", :any + field :registry_data, "registry_data", "KYBRegistryData" field :user_provided_data, "user_provided_data", :any field :confirmed_by_user_at, "confirmed_by_user_at", :datetime field :last_console_edit_at, "last_console_edit_at", :datetime @@ -911,6 +911,7 @@ class KybListShareholdersResponse202KybRegistry < Didit::Model field :registry_ownership_status, "registry_ownership_status", :string field :ownership, "ownership", "KYBRegistryOwnership" field :registry_tier, "registry_tier", :string + field :registry_monitoring, "registry_monitoring", "KybListShareholdersResponse202KybRegistryRegistryMonitoring" end class KybListShareholdersResponse202KybRegistryBeneficialOwners < Didit::Model @@ -958,6 +959,20 @@ class KybListShareholdersResponse202KybRegistryOfficers < Didit::Model field :date_of_birth_month, "date_of_birth_month", :integer end + # The latest registry monitor for the company, or `null` when none exists. + class KybListShareholdersResponse202KybRegistryRegistryMonitoring < Didit::Model + field :uuid, "uuid", :string + field :status, "status", :string + field :unavailable_reason, "unavailable_reason", :string + field :enrolled_at, "enrolled_at", :datetime + field :cancelled_at, "cancelled_at", :datetime + field :last_bill_date, "last_bill_date", :date + field :next_bill_date, "next_bill_date", :date + field :last_event_at, "last_event_at", :datetime + field :events_count, "events_count", :integer + field :watched_fields, "watched_fields", :any + end + # Full registry company profile. class KybListShareholdersResponseKybRegistry < Didit::Model field :uuid, "uuid", :string @@ -1000,7 +1015,7 @@ class KybListShareholdersResponseKybRegistry < Didit::Model field :addresses, "addresses", [:array, "KYBRegistryAddress"] field :industries, "industries", [:array, "KYBRegistryIndustry"] field :accounts, "accounts", :any - field :registry_data, "registry_data", :any + field :registry_data, "registry_data", "KYBRegistryData" field :user_provided_data, "user_provided_data", :any field :confirmed_by_user_at, "confirmed_by_user_at", :datetime field :last_console_edit_at, "last_console_edit_at", :datetime @@ -1009,6 +1024,7 @@ class KybListShareholdersResponseKybRegistry < Didit::Model field :registry_ownership_status, "registry_ownership_status", :string field :ownership, "ownership", "KYBRegistryOwnership" field :registry_tier, "registry_tier", :string + field :registry_monitoring, "registry_monitoring", "KybListShareholdersResponseKybRegistryRegistryMonitoring" end class KybListShareholdersResponseKybRegistryBeneficialOwners < Didit::Model @@ -1056,6 +1072,20 @@ class KybListShareholdersResponseKybRegistryOfficers < Didit::Model field :date_of_birth_month, "date_of_birth_month", :integer end + # The latest registry monitor for the company, or `null` when none exists. + class KybListShareholdersResponseKybRegistryRegistryMonitoring < Didit::Model + field :uuid, "uuid", :string + field :status, "status", :string + field :unavailable_reason, "unavailable_reason", :string + field :enrolled_at, "enrolled_at", :datetime + field :cancelled_at, "cancelled_at", :datetime + field :last_bill_date, "last_bill_date", :date + field :next_bill_date, "next_bill_date", :date + field :last_event_at, "last_event_at", :datetime + field :events_count, "events_count", :integer + field :watched_fields, "watched_fields", :any + end + class KybListUbosResponse < Didit::Model field :request_id, "request_id", :string field :registry_tier_requested, "registry_tier_requested", :string @@ -1118,7 +1148,7 @@ class KybListUbosResponse202KybRegistry < Didit::Model field :addresses, "addresses", [:array, "KYBRegistryAddress"] field :industries, "industries", [:array, "KYBRegistryIndustry"] field :accounts, "accounts", :any - field :registry_data, "registry_data", :any + field :registry_data, "registry_data", "KYBRegistryData" field :user_provided_data, "user_provided_data", :any field :confirmed_by_user_at, "confirmed_by_user_at", :datetime field :last_console_edit_at, "last_console_edit_at", :datetime @@ -1127,6 +1157,7 @@ class KybListUbosResponse202KybRegistry < Didit::Model field :registry_ownership_status, "registry_ownership_status", :string field :ownership, "ownership", "KYBRegistryOwnership" field :registry_tier, "registry_tier", :string + field :registry_monitoring, "registry_monitoring", "KybListUbosResponse202KybRegistryRegistryMonitoring" end class KybListUbosResponse202KybRegistryBeneficialOwners < Didit::Model @@ -1174,6 +1205,20 @@ class KybListUbosResponse202KybRegistryOfficers < Didit::Model field :date_of_birth_month, "date_of_birth_month", :integer end + # The latest registry monitor for the company, or `null` when none exists. + class KybListUbosResponse202KybRegistryRegistryMonitoring < Didit::Model + field :uuid, "uuid", :string + field :status, "status", :string + field :unavailable_reason, "unavailable_reason", :string + field :enrolled_at, "enrolled_at", :datetime + field :cancelled_at, "cancelled_at", :datetime + field :last_bill_date, "last_bill_date", :date + field :next_bill_date, "next_bill_date", :date + field :last_event_at, "last_event_at", :datetime + field :events_count, "events_count", :integer + field :watched_fields, "watched_fields", :any + end + # Full registry company profile. class KybListUbosResponseKybRegistry < Didit::Model field :uuid, "uuid", :string @@ -1216,7 +1261,7 @@ class KybListUbosResponseKybRegistry < Didit::Model field :addresses, "addresses", [:array, "KYBRegistryAddress"] field :industries, "industries", [:array, "KYBRegistryIndustry"] field :accounts, "accounts", :any - field :registry_data, "registry_data", :any + field :registry_data, "registry_data", "KYBRegistryData" field :user_provided_data, "user_provided_data", :any field :confirmed_by_user_at, "confirmed_by_user_at", :datetime field :last_console_edit_at, "last_console_edit_at", :datetime @@ -1225,6 +1270,7 @@ class KybListUbosResponseKybRegistry < Didit::Model field :registry_ownership_status, "registry_ownership_status", :string field :ownership, "ownership", "KYBRegistryOwnership" field :registry_tier, "registry_tier", :string + field :registry_monitoring, "registry_monitoring", "KybListUbosResponseKybRegistryRegistryMonitoring" end class KybListUbosResponseKybRegistryBeneficialOwners < Didit::Model @@ -1272,6 +1318,20 @@ class KybListUbosResponseKybRegistryOfficers < Didit::Model field :date_of_birth_month, "date_of_birth_month", :integer end + # The latest registry monitor for the company, or `null` when none exists. + class KybListUbosResponseKybRegistryRegistryMonitoring < Didit::Model + field :uuid, "uuid", :string + field :status, "status", :string + field :unavailable_reason, "unavailable_reason", :string + field :enrolled_at, "enrolled_at", :datetime + field :cancelled_at, "cancelled_at", :datetime + field :last_bill_date, "last_bill_date", :date + field :next_bill_date, "next_bill_date", :date + field :last_event_at, "last_event_at", :datetime + field :events_count, "events_count", :integer + field :watched_fields, "watched_fields", :any + end + class KybSearchResponse < Didit::Model field :request_id, "request_id", :string field :kyb_registry, "kyb_registry", "KYBRegistrySearchResults" @@ -1332,7 +1392,7 @@ class KybSelectResponseKybRegistry < Didit::Model field :addresses, "addresses", [:array, "KYBRegistryAddress"] field :industries, "industries", [:array, "KYBRegistryIndustry"] field :accounts, "accounts", :any - field :registry_data, "registry_data", :any + field :registry_data, "registry_data", "KYBRegistryData" field :user_provided_data, "user_provided_data", :any field :confirmed_by_user_at, "confirmed_by_user_at", :datetime field :last_console_edit_at, "last_console_edit_at", :datetime @@ -1341,6 +1401,7 @@ class KybSelectResponseKybRegistry < Didit::Model field :registry_ownership_status, "registry_ownership_status", :string field :ownership, "ownership", "KYBRegistryOwnership" field :registry_tier, "registry_tier", :string + field :registry_monitoring, "registry_monitoring", "KybSelectResponseKybRegistryRegistryMonitoring" end class KybSelectResponseKybRegistryBeneficialOwners < Didit::Model @@ -1387,5 +1448,19 @@ class KybSelectResponseKybRegistryOfficers < Didit::Model field :date_of_birth_year, "date_of_birth_year", :integer field :date_of_birth_month, "date_of_birth_month", :integer end + + # The latest registry monitor for the company, or `null` when none exists. + class KybSelectResponseKybRegistryRegistryMonitoring < Didit::Model + field :uuid, "uuid", :string + field :status, "status", :string + field :unavailable_reason, "unavailable_reason", :string + field :enrolled_at, "enrolled_at", :datetime + field :cancelled_at, "cancelled_at", :datetime + field :last_bill_date, "last_bill_date", :date + field :next_bill_date, "next_bill_date", :date + field :last_event_at, "last_event_at", :datetime + field :events_count, "events_count", :integer + field :watched_fields, "watched_fields", :any + end end end diff --git a/lib/didit/types/phone.rb b/lib/didit/types/phone.rb index 77cba71..b86c02b 100644 --- a/lib/didit/types/phone.rb +++ b/lib/didit/types/phone.rb @@ -22,6 +22,26 @@ module PhoneCheckCodeParamsDuplicatedPhoneNumberAction VALUES = [NO_ACTION, DECLINE].freeze end + # Action when the phone intelligence trust index is at or below the threshold. `DECLINE` flips the final `status` + # to `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is + # `true`. + module PhoneCheckCodeParamsLowPhoneTrustAction + NO_ACTION = "NO_ACTION" + DECLINE = "DECLINE" + + VALUES = [NO_ACTION, DECLINE].freeze + end + + # Action when the phone intelligence risk score is above the threshold. `DECLINE` flips the final `status` to + # `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is + # `true`. + module PhoneCheckCodeParamsPhoneIntelligenceScoreAction + NO_ACTION = "NO_ACTION" + DECLINE = "DECLINE" + + VALUES = [NO_ACTION, DECLINE].freeze + end + # Action when the social footprint check finds the number registered on none of the platforms it covers. Only # NO_ACTION and DECLINE are accepted on this endpoint; REVIEW is available on the workflow configuration key of # the same name. @@ -32,6 +52,24 @@ module PhoneCheckCodeParamsPhoneNoSocialPresenceAction VALUES = [NO_ACTION, DECLINE].freeze end + # Action when the number is a high-risk line type. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` + # records the signal without declining. Only takes effect when `enable_enrichment` is `true`. + module PhoneCheckCodeParamsPhoneTypeRiskAction + NO_ACTION = "NO_ACTION" + DECLINE = "DECLINE" + + VALUES = [NO_ACTION, DECLINE].freeze + end + + # Action when the number was ported to another carrier recently. `DECLINE` flips the final `status` to `Declined`; + # `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is `true`. + module PhoneCheckCodeParamsRecentPortAction + NO_ACTION = "NO_ACTION" + DECLINE = "DECLINE" + + VALUES = [NO_ACTION, DECLINE].freeze + end + # What to do when the carrier lookup reports a virtual line type - `voip`, `isp`, or `vpn` (`phone.is_virtual`). # `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the risk in `phone.warnings`. module PhoneCheckCodeParamsVoipNumberAction diff --git a/lib/didit/types/sessions.rb b/lib/didit/types/sessions.rb index 46877aa..d342b08 100644 --- a/lib/didit/types/sessions.rb +++ b/lib/didit/types/sessions.rb @@ -50,6 +50,114 @@ module SessionsBulkUpdateAmlHitStatusParamsHitUpdatesReviewStatus VALUES = [UNREVIEWED, CONFIRMED_MATCH, FALSE_POSITIVE, INCONCLUSIVE].freeze end + # Whether the party is an individual or a company. + module SessionsCreateKybPartyDraftParamsEntityType + PERSON = "person" + COMPANY = "company" + + VALUES = [PERSON, COMPANY].freeze + end + + # Role the party holds. Interchangeable with `roles`; when both are sent they are merged. + module SessionsCreateKybPartyDraftParamsRole + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + + # Known values of an open enum: the API may send others. + module SessionsCreateKybPartyDraftParamsRoles + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + + # Whether the party is an individual or a company. + module SessionsCreateKybPartyDraftResponsePartyEntityType + PERSON = "person" + COMPANY = "company" + + VALUES = [PERSON, COMPANY].freeze + end + + # Role the party holds. Interchangeable with `roles`; when both are sent they are merged. + module SessionsCreateKybPartyDraftResponsePartyRole + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + + # Known values of an open enum: the API may send others. + module SessionsCreateKybPartyDraftResponsePartyRoles + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + # Determines which device should handle the redirect to the provided callback URL. Use `initiator` to redirect # only the device that started the flow, `completer` for the device that finishes it, or `both` to allow either # device to trigger the callback. If you ever notice the callback not triggering reliably, we recommend setting @@ -366,6 +474,91 @@ module SessionsImportsStartParamsStatusMappingValue VALUES = [APPROVED, DECLINED, IN_REVIEW, EXPIRED, NOT_FINISHED, ABANDONED].freeze end + # Known values of an open enum: the API may send others. + module SessionsListKybExtractedPartiesResponsePartiesEntityType + PERSON = "person" + COMPANY = "company" + + VALUES = [PERSON, COMPANY].freeze + end + + # Known values of an open enum: the API may send others. + module SessionsListKybExtractedPartiesResponsePartiesRolesRole + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + + # Whether the party is an individual or a company. + module SessionsListKybPartyDraftsResponsePartiesPartyEntityType + PERSON = "person" + COMPANY = "company" + + VALUES = [PERSON, COMPANY].freeze + end + + # Role the party holds. Interchangeable with `roles`; when both are sent they are merged. + module SessionsListKybPartyDraftsResponsePartiesPartyRole + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + + # Known values of an open enum: the API may send others. + module SessionsListKybPartyDraftsResponsePartiesPartyRoles + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + # Known values of an open enum: the API may send others. module SessionsListParamsApiService ID_VERIFICATION = "ID_VERIFICATION" @@ -421,8 +614,9 @@ module SessionsListResponseResultsFeaturesFeature IP_ANALYSIS = "IP_ANALYSIS" AGE_ESTIMATION = "AGE_ESTIMATION" DATABASE_VALIDATION = "DATABASE_VALIDATION" + GEOLOCATION = "GEOLOCATION" - VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACE_MATCH, POA, QUESTIONNAIRE, EMAIL_VERIFICATION, PHONE, AML, IP_ANALYSIS, AGE_ESTIMATION, DATABASE_VALIDATION].freeze + VALUES = [ID_VERIFICATION, NFC, LIVENESS, FACE_MATCH, POA, QUESTIONNAIRE, EMAIL_VERIFICATION, PHONE, AML, IP_ANALYSIS, AGE_ESTIMATION, DATABASE_VALIDATION, GEOLOCATION].freeze end # Status of this feature. `Not Finished` until the step completes. @@ -531,8 +725,9 @@ module SessionsPreviewResubmissionParamsNodesToResubmitFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" KYB = "KYB" + GEOLOCATION = "GEOLOCATION" - VALUES = [OCR, OCR_BACK, NFC, AML, FACE, LIVENESS, FACE_MATCH, IP_ANALYSIS, AGE_ESTIMATION, PROOF_OF_ADDRESS, PHONE_VERIFICATION, EMAIL_VERIFICATION, FACE_SEARCH, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_DOCUMENTS, ID_VERIFICATION, POA, PHONE, EMAIL, KYB_REGISTRY, KYB_KEY_PEOPLE, KYB].freeze + VALUES = [OCR, OCR_BACK, NFC, AML, FACE, LIVENESS, FACE_MATCH, IP_ANALYSIS, AGE_ESTIMATION, PROOF_OF_ADDRESS, PHONE_VERIFICATION, EMAIL_VERIFICATION, FACE_SEARCH, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_DOCUMENTS, ID_VERIFICATION, POA, PHONE, EMAIL, KYB_REGISTRY, KYB_KEY_PEOPLE, KYB, GEOLOCATION].freeze end # Feature type of the node. The aliases `ID_VERIFICATION`, `POA`, `PHONE`, and `EMAIL` are normalized server-side @@ -563,8 +758,9 @@ module SessionsPreviewResubmissionResponseNodesToResubmitFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" KYB = "KYB" + GEOLOCATION = "GEOLOCATION" - VALUES = [OCR, OCR_BACK, NFC, AML, FACE, LIVENESS, FACE_MATCH, IP_ANALYSIS, AGE_ESTIMATION, PROOF_OF_ADDRESS, PHONE_VERIFICATION, EMAIL_VERIFICATION, FACE_SEARCH, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_DOCUMENTS, ID_VERIFICATION, POA, PHONE, EMAIL, KYB_REGISTRY, KYB_KEY_PEOPLE, KYB].freeze + VALUES = [OCR, OCR_BACK, NFC, AML, FACE, LIVENESS, FACE_MATCH, IP_ANALYSIS, AGE_ESTIMATION, PROOF_OF_ADDRESS, PHONE_VERIFICATION, EMAIL_VERIFICATION, FACE_SEARCH, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_DOCUMENTS, ID_VERIFICATION, POA, PHONE, EMAIL, KYB_REGISTRY, KYB_KEY_PEOPLE, KYB, GEOLOCATION].freeze end # Why confirming would send no email, or `null` when it will be sent. `no_user_action`: every selected step runs @@ -925,6 +1121,114 @@ module SessionsUpdateKybCompanyDataResponseVatValidationStatus VALUES = [VALID, INVALID, FORMAT_VALID, INVALID_FORMAT, COULD_NOT_VALIDATE, NOT_APPLICABLE].freeze end + # Whether the party is an individual or a company. + module SessionsUpdateKybPartyDraftParamsEntityType + PERSON = "person" + COMPANY = "company" + + VALUES = [PERSON, COMPANY].freeze + end + + # Role the party holds. Interchangeable with `roles`; when both are sent they are merged. + module SessionsUpdateKybPartyDraftParamsRole + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + + # Known values of an open enum: the API may send others. + module SessionsUpdateKybPartyDraftParamsRoles + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + + # Whether the party is an individual or a company. + module SessionsUpdateKybPartyDraftResponsePartyEntityType + PERSON = "person" + COMPANY = "company" + + VALUES = [PERSON, COMPANY].freeze + end + + # Role the party holds. Interchangeable with `roles`; when both are sent they are merged. + module SessionsUpdateKybPartyDraftResponsePartyRole + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + + # Known values of an open enum: the API may send others. + module SessionsUpdateKybPartyDraftResponsePartyRoles + DIRECTOR = "director" + NON_EXECUTIVE_DIRECTOR = "non_executive_director" + SECRETARY = "secretary" + CHAIRMAN = "chairman" + UBO = "ubo" + SHAREHOLDER = "shareholder" + REPRESENTATIVE = "representative" + FOUNDER = "founder" + LEGAL_ADVISOR = "legal_advisor" + AUTHORIZED_SIGNATORY = "authorized_signatory" + TRUSTEE = "trustee" + BENEFICIARY = "beneficiary" + SETTLOR = "settlor" + PROTECTOR = "protector" + COMPANY_OFFICER = "company_officer" + INVESTOR = "investor" + OTHER = "other" + + VALUES = [DIRECTOR, NON_EXECUTIVE_DIRECTOR, SECRETARY, CHAIRMAN, UBO, SHAREHOLDER, REPRESENTATIVE, FOUNDER, LEGAL_ADVISOR, AUTHORIZED_SIGNATORY, TRUSTEE, BENEFICIARY, SETTLOR, PROTECTOR, COMPANY_OFFICER, INVESTOR, OTHER].freeze + end + # Whether the party is an individual or a company. module SessionsUpdateKybPartyResponseEntityType PERSON = "person" @@ -993,8 +1297,19 @@ module SessionsUpdateStatusParamsNodesToResubmitFeature KYB_REGISTRY = "KYB_REGISTRY" KYB_KEY_PEOPLE = "KYB_KEY_PEOPLE" KYB = "KYB" + GEOLOCATION = "GEOLOCATION" + + VALUES = [OCR, OCR_BACK, NFC, AML, FACE, LIVENESS, FACE_MATCH, IP_ANALYSIS, AGE_ESTIMATION, PROOF_OF_ADDRESS, PHONE_VERIFICATION, EMAIL_VERIFICATION, FACE_SEARCH, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_DOCUMENTS, ID_VERIFICATION, POA, PHONE, EMAIL, KYB_REGISTRY, KYB_KEY_PEOPLE, KYB, GEOLOCATION].freeze + end - VALUES = [OCR, OCR_BACK, NFC, AML, FACE, LIVENESS, FACE_MATCH, IP_ANALYSIS, AGE_ESTIMATION, PROOF_OF_ADDRESS, PHONE_VERIFICATION, EMAIL_VERIFICATION, FACE_SEARCH, DATABASE_VALIDATION, QUESTIONNAIRE, DOCUMENT_AI, KYB_DOCUMENTS, ID_VERIFICATION, POA, PHONE, EMAIL, KYB_REGISTRY, KYB_KEY_PEOPLE, KYB].freeze + # Required document group this upload answers. + module SessionsUploadKybDocumentsParamsDocumentGroup + LEGAL_PRESENCE = "LEGAL_PRESENCE" + COMPANY_DETAILS = "COMPANY_DETAILS" + OWNERSHIP_STRUCTURE = "OWNERSHIP_STRUCTURE" + REPRESENTATIVES_AUTHORIZATION = "REPRESENTATIVES_AUTHORIZATION" + + VALUES = [LEGAL_PRESENCE, COMPANY_DETAILS, OWNERSHIP_STRUCTURE, REPRESENTATIVES_AUTHORIZATION].freeze end class SessionsAddImagesResponse < Didit::Model @@ -1019,6 +1334,32 @@ class SessionsBulkUpdateAmlHitStatusResponse < Didit::Model field :updated_hits, "updated_hits", [:array, :string] end + class SessionsCreateKybPartyDraftResponse < Didit::Model + field :draft_id, "draft_id", :string + field :created_at, "created_at", :datetime + field :updated_at, "updated_at", :datetime + field :party, "party", "SessionsCreateKybPartyDraftResponseParty" + end + + class SessionsCreateKybPartyDraftResponseParty < Didit::Model + field :entity_type, "entity_type", :string + field :full_name, "full_name", :string + field :first_name, "first_name", :string + field :last_name, "last_name", :string + field :role, "role", :string + field :roles, "roles", [:array, :string] + field :position, "position", :string + field :date_of_birth, "date_of_birth", :date + field :company_name, "company_name", :string + field :registration_number, "registration_number", :string + field :email, "email", :string + field :ownership_percent, "ownership_percent", :float + field :nationality, "nationality", :string + field :phone_number, "phone_number", :string + field :custom_fields, "custom_fields", :any + field :skip_verification, "skip_verification", :boolean + end + class SessionsCreateResponse < Didit::Model field :session_id, "session_id", :string field :session_number, "session_number", :integer @@ -1099,6 +1440,73 @@ class SessionsListFeatureOverridesResponse < Didit::Model field :overrides, "overrides", [:array, "FeatureStatusOverride"] end + class SessionsListKybExtractedPartiesResponse < Didit::Model + field :parties, "parties", [:array, "SessionsListKybExtractedPartiesResponseParties"] + field :document_count, "document_count", :integer + field :node_id, "node_id", :string + end + + class SessionsListKybExtractedPartiesResponseParties < Didit::Model + field :name, "name", :string + field :entity_type, "entity_type", :string + field :first_name, "first_name", :string + field :last_name, "last_name", :string + field :appointment_date, "appointment_date", :string + field :designation, "designation", :string + field :roles, "roles", [:array, "SessionsListKybExtractedPartiesResponsePartiesRoles"] + field :documents, "documents", [:array, "SessionsListKybExtractedPartiesResponsePartiesDocuments"] + end + + class SessionsListKybExtractedPartiesResponsePartiesDocuments < Didit::Model + field :document_uuid, "document_uuid", :string + field :document_type, "document_type", :string + field :document_subtype, "document_subtype", :string + field :original_filename, "original_filename", :string + field :status, "status", :string + end + + class SessionsListKybExtractedPartiesResponsePartiesRoles < Didit::Model + field :role, "role", :string + field :ownership_percent, "ownership_percent", "SessionsListKybExtractedPartiesResponsePartiesRolesOwnershipPercent" + end + + class SessionsListKybExtractedPartiesResponsePartiesRolesOwnershipPercent < Didit::Model + field :text, "text", :string + field :min, "min", :float + field :max, "max", :float + end + + class SessionsListKybPartyDraftsResponse < Didit::Model + field :parties, "parties", [:array, "SessionsListKybPartyDraftsResponseParties"] + field :node_id, "node_id", :string + end + + class SessionsListKybPartyDraftsResponseParties < Didit::Model + field :draft_id, "draft_id", :string + field :created_at, "created_at", :datetime + field :updated_at, "updated_at", :datetime + field :party, "party", "SessionsListKybPartyDraftsResponsePartiesParty" + end + + class SessionsListKybPartyDraftsResponsePartiesParty < Didit::Model + field :entity_type, "entity_type", :string + field :full_name, "full_name", :string + field :first_name, "first_name", :string + field :last_name, "last_name", :string + field :role, "role", :string + field :roles, "roles", [:array, :string] + field :position, "position", :string + field :date_of_birth, "date_of_birth", :date + field :company_name, "company_name", :string + field :registration_number, "registration_number", :string + field :email, "email", :string + field :ownership_percent, "ownership_percent", :float + field :nationality, "nationality", :string + field :phone_number, "phone_number", :string + field :custom_fields, "custom_fields", :any + field :skip_verification, "skip_verification", :boolean + end + class SessionsListResponse < Didit::Model field :count, "count", :integer field :next, "next", :string @@ -1123,6 +1531,11 @@ class SessionsListResponseResults < Didit::Model field :phone_number, "phone_number", "SessionsListResponseResultsPhoneNumber" field :email_address, "email_address", "SessionsListResponseResultsEmailAddress" field :additional_details, "additional_details", "SessionsListResponseResultsAdditionalDetails" + field :assignee, "assignee", "SessionsListResponseResultsAssignee" + field :waiting_since, "waiting_since", :datetime + field :sla_due_at, "sla_due_at", :datetime + field :top_warnings, "top_warnings", [:array, "SessionsListResponseResultsTopWarnings"] + field :warnings_count, "warnings_count", :integer field :workflow_id, "workflow_id", :string field :workflow_type, "workflow_type", :string field :workflow_label, "workflow_label", :string @@ -1201,6 +1614,12 @@ class SessionsListResponseResultsAdditionalDetailsPoa < Didit::Model field :name_on_document, "name_on_document", :string end + # The Console reviewer the session is assigned to, or `null` when nobody holds it. + class SessionsListResponseResultsAssignee < Didit::Model + field :email, "email", :string + field :assigned_at, "assigned_at", :datetime + end + # Email associated with the session: the verified email when email verification ran, otherwise the contact email # provided at session creation. `null` when neither exists. class SessionsListResponseResultsEmailAddress < Didit::Model @@ -1220,6 +1639,13 @@ class SessionsListResponseResultsPhoneNumber < Didit::Model field :is_verified, "is_verified", :boolean end + class SessionsListResponseResultsTopWarnings < Didit::Model + field :risk, "risk", :string + field :feature, "feature", :string + field :log_type, "log_type", :string + field :short_description, "short_description", :string + end + class SessionsPreviewDecisionEmailResponse < Didit::Model field :recipient, "recipient", :string field :recipient_source, "recipient_source", :string @@ -1229,6 +1655,7 @@ class SessionsPreviewDecisionEmailResponse < Didit::Model field :sender_kind, "sender_kind", :string field :subject, "subject", :string field :html, "html", :string + field :text, "text", :string field :language, "language", :string field :will_be_sent, "will_be_sent", :boolean field :not_sent_reason, "not_sent_reason", :string @@ -1244,6 +1671,7 @@ class SessionsPreviewResubmissionResponse < Didit::Model field :sender_kind, "sender_kind", :string field :subject, "subject", :string field :html, "html", :string + field :text, "text", :string field :language, "language", :string field :will_be_sent, "will_be_sent", :boolean field :not_sent_reason, "not_sent_reason", :string @@ -1281,6 +1709,16 @@ class SessionsSignaturesValidateResponse < Didit::Model field :signatures, "signatures", [:array, "SignatureResult"] end + class SessionsSubmitKybPartiesResponse < Didit::Model + field :valid, "valid", :boolean + field :next_step, "next_step", :string + field :status, "status", :string + field :advanced, "advanced", :boolean + field :already_submitted, "already_submitted", :boolean + field :kyb_key_people_status, "kyb_key_people_status", :string + field :parties, "parties", [:array, "KYBKeyPeopleParty"] + end + class SessionsUpdateAmlHitStatusResponse < Didit::Model field :message, "message", :string field :hit_id, "hit_id", :string @@ -1386,13 +1824,39 @@ class SessionsUpdateKybCompanyDataResponse < Didit::Model field :addresses, "addresses", [:array, :any] field :industries, "industries", [:array, :any] field :accounts, "accounts", :any - field :registry_data, "registry_data", :any + field :registry_data, "registry_data", "KYBRegistryData" field :user_provided_data, "user_provided_data", :any field :confirmed_by_user_at, "confirmed_by_user_at", :datetime field :last_console_edit_at, "last_console_edit_at", :datetime field :is_editable, "is_editable", :boolean end + class SessionsUpdateKybPartyDraftResponse < Didit::Model + field :draft_id, "draft_id", :string + field :created_at, "created_at", :datetime + field :updated_at, "updated_at", :datetime + field :party, "party", "SessionsUpdateKybPartyDraftResponseParty" + end + + class SessionsUpdateKybPartyDraftResponseParty < Didit::Model + field :entity_type, "entity_type", :string + field :full_name, "full_name", :string + field :first_name, "first_name", :string + field :last_name, "last_name", :string + field :role, "role", :string + field :roles, "roles", [:array, :string] + field :position, "position", :string + field :date_of_birth, "date_of_birth", :date + field :company_name, "company_name", :string + field :registration_number, "registration_number", :string + field :email, "email", :string + field :ownership_percent, "ownership_percent", :float + field :nationality, "nationality", :string + field :phone_number, "phone_number", :string + field :custom_fields, "custom_fields", :any + field :skip_verification, "skip_verification", :boolean + end + # Key People party record - the same shape as an entry of `key_people_checks[].submitted.parties[]` on the # business session decision. class SessionsUpdateKybPartyResponse < Didit::Model @@ -1437,5 +1901,12 @@ class SessionsUpdatePoaDataResponsePoaParsedAddress < Didit::Model class SessionsUpdateStatusResponse < Didit::Model field :session_id, "session_id", :string end + + class SessionsUploadKybDocumentsResponse < Didit::Model + field :valid, "valid", :boolean + field :next_step, "next_step", :string + field :kyb_status, "kyb_status", :string + field :document_answer, "document_answer", :any + end end end diff --git a/lib/didit/types/travel_rule.rb b/lib/didit/types/travel_rule.rb index c20db6a..72d8e4d 100644 --- a/lib/didit/types/travel_rule.rb +++ b/lib/didit/types/travel_rule.rb @@ -151,6 +151,13 @@ class TravelRuleTransfersListResponse < Didit::Model field :results, "results", [:array, "TravelRuleTransferRow"] end + class TravelRuleUnmatchedDepositsListResponse < Didit::Model + field :count, "count", :integer + field :next, "next", :string + field :previous, "previous", :string + field :results, "results", [:array, "TravelRuleTransferRow"] + end + class TravelRuleWalletAddressesListResponse < Didit::Model field :count, "count", :integer field :next, "next", :string diff --git a/lib/didit/types/wallet_screening.rb b/lib/didit/types/wallet_screening.rb index 292cb0b..d37f5a7 100644 --- a/lib/didit/types/wallet_screening.rb +++ b/lib/didit/types/wallet_screening.rb @@ -3,11 +3,14 @@ module Didit module Types - # Network identifier. Managed screening supports BTC, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base), - # OP (Optimism), and ARB (Arbitrum One). USDT and USDC are legacy Ethereum aliases, not multi-network searches. - # Connected-provider coverage varies. LIGHTNING requires a supported connected provider. CELO (Celo), MODE (Mode) - # and PLUME (Plume) are screened through a connected TRM Labs account; managed screening answers 400 for them. - # Alias: `currency`. + # Optional network identifier. When omitted, the network is read from the address format: `bc1`, `1` and `3` + # addresses are Bitcoin (BTC), `T` addresses are Tron (TRX) and base58 public keys are Solana (SOL). A `0x` + # address is valid on every EVM network, so omitting `blockchain` for it answers 422 with the candidate networks + # in `candidate_chains`. Managed screening supports BTC, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, BASE + # (Base), OP (Optimism), ARB (Arbitrum One), AVAX (Avalanche C-Chain), ADA (Cardano), XLM (Stellar) and HBAR + # (Hedera). USDT and USDC are legacy Ethereum aliases, not multi-network searches. Connected-provider coverage + # varies. LIGHTNING requires a supported connected provider. CELO (Celo), MODE (Mode) and PLUME (Plume) are + # screened through a connected TRM Labs account; managed screening answers 400 for them. Alias: `currency`. module WalletScreeningScreenParamsBlockchain BTC = "BTC" LIGHTNING = "LIGHTNING" @@ -25,11 +28,15 @@ module WalletScreeningScreenParamsBlockchain BASE = "BASE" OP = "OP" ARB = "ARB" + AVAX = "AVAX" + ADA = "ADA" + XLM = "XLM" + HBAR = "HBAR" CELO = "CELO" MODE = "MODE" PLUME = "PLUME" - VALUES = [BTC, LIGHTNING, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, USDT, USDC, BASE, OP, ARB, CELO, MODE, PLUME].freeze + VALUES = [BTC, LIGHTNING, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, USDT, USDC, BASE, OP, ARB, AVAX, ADA, XLM, HBAR, CELO, MODE, PLUME].freeze end # Optional. Whether the address is being screened as an inbound (deposit) or outbound (withdrawal) counterparty. diff --git a/openapi/SOURCE.json b/openapi/SOURCE.json index 01a2b69..3d175c7 100644 --- a/openapi/SOURCE.json +++ b/openapi/SOURCE.json @@ -1,13 +1,13 @@ { "verification.json": { "url": "https://docs.didit.me/openapi-25.json", - "sha256": "12b2fdb05572755d61b93791f6964b7d883ba7b20f7ea9b31543903b6edab8a9", - "fetched_at": "2026-10-29T06:50:12Z" + "sha256": "c6707376c9bcdf636c1fd5452f61955c2c5ca304cce6a1ea8018d4c087fe8914", + "fetched_at": "2026-11-01T06:46:24Z" }, "account.json": { "url": "https://docs.didit.me/openapi-auth.json", - "sha256": "ae1b5e07df822fe93cae27a9eaa0790948069352c9d98c87eecf7efd644c92cb", - "fetched_at": "2026-10-29T06:50:12Z" + "sha256": "5b45b1896ef3107dd9a601c76d9ba35761bae5f04ac731b6c27876603903bf05", + "fetched_at": "2026-11-01T06:46:24Z" }, "webhook-vectors.json": { "generator": "product-automations scripts/server-sdks/make_vectors.py (seeded 2026-10-17)", diff --git a/openapi/account.json b/openapi/account.json index b832f39..22b6117 100644 --- a/openapi/account.json +++ b/openapi/account.json @@ -207,12 +207,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n \"https://apx.didit.me/auth/v2/programmatic/register/\",\n json={\n \"email\": \"you@yourdomain.com\",\n \"password\": \"MyStr0ng!Pass\",\n },\n timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json())\n# {'message': 'Registration successful...', 'email': 'you@yourdomain.com'}" + "source": "from didit import Didit\n\n# This call needs no API key.\nclient = Didit()\n\nresult = client.account.register(\n email=\"you@yourdomain.com\",\n password=\"MyStr0ng!Pass\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch(\n \"https://apx.didit.me/auth/v2/programmatic/register/\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n email: \"you@yourdomain.com\",\n password: \"MyStr0ng!Pass\",\n }),\n },\n);\nif (!resp.ok) throw new Error(`Register failed: ${resp.status}`);\nconst data = await resp.json();\nconsole.log(data);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// This call needs no API key.\nconst didit = new Didit();\n\nconst result = await didit.account.register({\n email: \"you@yourdomain.com\",\n password: \"MyStr0ng!Pass\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// This call needs no API key.\nclient := didit.NewClient()\n\nresult, err := client.Account.Register(ctx, didit.RegisterRequest{\n\tEmail: \"you@yourdomain.com\",\n\tPassword: \"MyStr0ng!Pass\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.RegisterRequest;\n\n// This call needs no API key.\nDidit client = new Didit();\n\nvar result = client.account().register(RegisterRequest.builder()\n .email(\"you@yourdomain.com\")\n .password(\"MyStr0ng!Pass\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "account->register([\n 'email' => 'you@yourdomain.com',\n 'password' => 'MyStr0ng!Pass',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# This call needs no API key.\ndidit = Didit::Client.new\n\nresult = didit.account.register(\n email: \"you@yourdomain.com\",\n password: \"MyStr0ng!Pass\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// This call needs no API key.\nusing var client = new DiditClient();\n\nvar result = await client.Account.RegisterAsync(new RegisterRequest\n{\n Email = \"you@yourdomain.com\",\n Password = \"MyStr0ng!Pass\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "security": [ @@ -362,12 +387,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n \"https://apx.didit.me/auth/v2/programmatic/verify-email/\",\n json={\n \"email\": \"you@yourdomain.com\",\n \"code\": \"A3K9F2\",\n },\n timeout=10,\n)\nresp.raise_for_status()\ndata = resp.json()\n\napi_key = data[\"application\"][\"api_key\"]\nprint(f\"Save this for x-api-key: {api_key}\")" + "source": "from didit import Didit\n\n# This call needs no API key.\nclient = Didit()\n\nresult = client.account.verify_email(\n email=\"you@yourdomain.com\",\n code=\"A3K9F2\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch(\n \"https://apx.didit.me/auth/v2/programmatic/verify-email/\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n email: \"you@yourdomain.com\",\n code: \"A3K9F2\",\n }),\n },\n);\nif (!resp.ok) throw new Error(`Verify failed: ${resp.status}`);\nconst { application, access_token } = await resp.json();\n// application.api_key -> x-api-key for verification.didit.me/v3\n// access_token -> Authorization: Bearer ... for this auth API" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// This call needs no API key.\nconst didit = new Didit();\n\nconst result = await didit.account.verifyEmail({\n email: \"you@yourdomain.com\",\n code: \"A3K9F2\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// This call needs no API key.\nclient := didit.NewClient()\n\nresult, err := client.Account.VerifyEmail(ctx, didit.VerifyEmailRequest{\n\tEmail: \"you@yourdomain.com\",\n\tCode: \"A3K9F2\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.VerifyEmailRequest;\n\n// This call needs no API key.\nDidit client = new Didit();\n\nvar result = client.account().verifyEmail(VerifyEmailRequest.builder()\n .email(\"you@yourdomain.com\")\n .code(\"A3K9F2\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "account->verifyEmail([\n 'email' => 'you@yourdomain.com',\n 'code' => 'A3K9F2',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# This call needs no API key.\ndidit = Didit::Client.new\n\nresult = didit.account.verify_email(\n email: \"you@yourdomain.com\",\n code: \"A3K9F2\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// This call needs no API key.\nusing var client = new DiditClient();\n\nvar result = await client.Account.VerifyEmailAsync(new VerifyEmailRequest\n{\n Email = \"you@yourdomain.com\",\n Code = \"A3K9F2\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "security": [ @@ -410,7 +460,7 @@ }, "responses": { "200": { - "description": "Login successful. Returns a fresh JWT pair. Use the `access_token` as `Authorization: Bearer ` against `/organizations/me/...` to look up the `org_id`, `app_id`, and `api_key`.", + "description": "Login successful. Returns a fresh JWT pair. Use the `access_token` as `Authorization: Bearer ` against `/organizations/me/...` to look up the `org_id`, `app_id`, and `api_key`. When the account has an authenticator app or a passkey, the response carries `2fa_required: true` and a `temp_token` instead of tokens.", "content": { "application/json": { "schema": { @@ -497,7 +547,7 @@ } }, "403": { - "description": "The account was recovered and must set up a new sign-in method before it can log in. A link to do that was emailed to the account's address.", + "description": "The account was recovered and must set up a new sign-in method before it can log in. A link to do that was emailed to the account's address. An account whose organization enforces SSO gets `403` with `error: sso_required`, `organization_name`, `organization_slug` and `sso_url`.", "content": { "application/json": { "schema": { @@ -557,12 +607,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n \"https://apx.didit.me/auth/v2/programmatic/login/\",\n json={\n \"email\": \"you@yourdomain.com\",\n \"password\": \"MyStr0ng!Pass\",\n },\n timeout=10,\n)\nresp.raise_for_status()\ntokens = resp.json()\naccess_token = tokens[\"access_token\"]\n\n# Use against the Account Management endpoints on this host\norgs = requests.get(\n \"https://apx.didit.me/auth/v2/organizations/me/\",\n headers={\"Authorization\": f\"Bearer {access_token}\"},\n timeout=10,\n).json()" + "source": "from didit import Didit\n\n# This call needs no API key.\nclient = Didit()\n\nresult = client.account.login(\n email=\"you@yourdomain.com\",\n password=\"MyStr0ng!Pass\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch(\n \"https://apx.didit.me/auth/v2/programmatic/login/\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n email: \"you@yourdomain.com\",\n password: \"MyStr0ng!Pass\",\n }),\n },\n);\nif (!resp.ok) throw new Error(`Login failed: ${resp.status}`);\nconst { access_token } = await resp.json();\n\n// Use against the Account Management endpoints on this host\nconst orgs = await fetch(\n \"https://apx.didit.me/auth/v2/organizations/me/\",\n { headers: { Authorization: `Bearer ${access_token}` } },\n).then((r) => r.json());" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// This call needs no API key.\nconst didit = new Didit();\n\nconst result = await didit.account.login({\n email: \"you@yourdomain.com\",\n password: \"MyStr0ng!Pass\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// This call needs no API key.\nclient := didit.NewClient()\n\nresult, err := client.Account.Login(ctx, didit.LoginRequest{\n\tEmail: \"you@yourdomain.com\",\n\tPassword: \"MyStr0ng!Pass\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.LoginRequest;\n\n// This call needs no API key.\nDidit client = new Didit();\n\nvar result = client.account().login(LoginRequest.builder()\n .email(\"you@yourdomain.com\")\n .password(\"MyStr0ng!Pass\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "account->login([\n 'email' => 'you@yourdomain.com',\n 'password' => 'MyStr0ng!Pass',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# This call needs no API key.\ndidit = Didit::Client.new\n\nresult = didit.account.login(\n email: \"you@yourdomain.com\",\n password: \"MyStr0ng!Pass\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// This call needs no API key.\nusing var client = new DiditClient();\n\nvar result = await client.Account.LoginAsync(new LoginRequest\n{\n Email = \"you@yourdomain.com\",\n Password = \"MyStr0ng!Pass\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "security": [ @@ -684,12 +759,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.get(\n \"https://apx.didit.me/auth/v2/organizations/me/\",\n headers={\"Authorization\": f\"Bearer {access_token}\"},\n timeout=10,\n)\nresp.raise_for_status()\norgs = resp.json()[\"results\"] # paginated: count, next, previous, results\nfirst_org_id = orgs[0][\"uuid\"]" + "source": "from didit import Didit\n\n# Use the access token that account.login returns.\nclient = Didit(account_token=\"YOUR_ACCESS_TOKEN\")\n\nfor item in client.account.organizations.list():\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch(\n \"https://apx.didit.me/auth/v2/organizations/me/\",\n { headers: { Authorization: `Bearer ${accessToken}` } },\n);\nif (!resp.ok) throw new Error(`List orgs failed: ${resp.status}`);\nconst { results: orgs } = await resp.json(); // paginated: count, next, previous, results\nconst firstOrgId = orgs[0].uuid;" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Use the access token that account.login returns.\nconst didit = new Didit({ accountToken: \"YOUR_ACCESS_TOKEN\" });\n\nfor await (const item of didit.account.organizations.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Use the access token that account.login returns.\nclient := didit.NewClient(option.WithAccountToken(\"YOUR_ACCESS_TOKEN\"))\n\niter := client.Account.Organizations.ListAutoPaging(ctx, didit.AccountOrganizationsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Use the access token that account.login returns.\nDidit client = Didit.builder().accountToken(\"YOUR_ACCESS_TOKEN\").build();\n\nfor (var item : client.account().organizations().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "account->organizations->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Use the access token that account.login returns.\ndidit = Didit::Client.new(account_token: \"YOUR_ACCESS_TOKEN\")\n\ndidit.account.organizations.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Use the access token that account.login returns.\nusing var client = new DiditClient(new DiditClientOptions { AccountToken = \"YOUR_ACCESS_TOKEN\" });\n\nawait foreach (var item in await client.Account.Organizations.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "parameters": [ @@ -952,12 +1052,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n f\"https://apx.didit.me/auth/v2/organizations/me/{org_id}/applications/\",\n headers={\"Authorization\": f\"Bearer {access_token}\"},\n json={\n \"name\": \"Acme Customer App\",\n \"website_url\": \"https://acme.example\",\n \"redirect_uris\": [\"https://acme.example/callback\"],\n },\n timeout=10,\n)\nresp.raise_for_status()\napp = resp.json()\nprint(\"Save this:\", app[\"api_key\"])" + "source": "from didit import Didit\n\n# Use the access token that account.login returns.\nclient = Didit(account_token=\"YOUR_ACCESS_TOKEN\")\n\nresult = client.account.applications.create(\n \"a1b2c3d4-5678-90ab-cdef-111111111111\",\n name=\"Acme Customer App\",\n website_url=\"https://acme.example\",\n redirect_uris=[\"https://acme.example/callback\"],\n terms_url=\"https://acme.example/terms\",\n privacy_url=\"https://acme.example/privacy\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch(\n `https://apx.didit.me/auth/v2/organizations/me/${orgId}/applications/`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: \"Acme Customer App\",\n website_url: \"https://acme.example\",\n redirect_uris: [\"https://acme.example/callback\"],\n }),\n },\n);\nif (!resp.ok) throw new Error(`Create app failed: ${resp.status}`);\nconst app = await resp.json();\nconsole.log(\"Save this:\", app.api_key);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Use the access token that account.login returns.\nconst didit = new Didit({ accountToken: \"YOUR_ACCESS_TOKEN\" });\n\nconst result = await didit.account.applications.create(\"a1b2c3d4-5678-90ab-cdef-111111111111\", {\n name: \"Acme Customer App\",\n website_url: \"https://acme.example\",\n redirect_uris: [\"https://acme.example/callback\"],\n terms_url: \"https://acme.example/terms\",\n privacy_url: \"https://acme.example/privacy\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Use the access token that account.login returns.\nclient := didit.NewClient(option.WithAccountToken(\"YOUR_ACCESS_TOKEN\"))\n\nresult, err := client.Account.Applications.Create(ctx, \"a1b2c3d4-5678-90ab-cdef-111111111111\", didit.ApplicationCreateRequest{\n\tName: didit.String(\"Acme Customer App\"),\n\tWebsiteURL: didit.String(\"https://acme.example\"),\n\tRedirectURIs: didit.Some([]string{\"https://acme.example/callback\"}),\n\tTermsURL: didit.String(\"https://acme.example/terms\"),\n\tPrivacyURL: didit.String(\"https://acme.example/privacy\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.ApplicationCreateRequest;\n\n// Use the access token that account.login returns.\nDidit client = Didit.builder().accountToken(\"YOUR_ACCESS_TOKEN\").build();\n\nvar result = client.account().applications().create(\"a1b2c3d4-5678-90ab-cdef-111111111111\", ApplicationCreateRequest.builder()\n .name(\"Acme Customer App\")\n .websiteUrl(\"https://acme.example\")\n .redirectUris(List.of(\"https://acme.example/callback\"))\n .termsUrl(\"https://acme.example/terms\")\n .privacyUrl(\"https://acme.example/privacy\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "account->applications->create('a1b2c3d4-5678-90ab-cdef-111111111111', [\n 'name' => 'Acme Customer App',\n 'website_url' => 'https://acme.example',\n 'redirect_uris' => ['https://acme.example/callback'],\n 'terms_url' => 'https://acme.example/terms',\n 'privacy_url' => 'https://acme.example/privacy',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Use the access token that account.login returns.\ndidit = Didit::Client.new(account_token: \"YOUR_ACCESS_TOKEN\")\n\nresult = didit.account.applications.create(\n \"a1b2c3d4-5678-90ab-cdef-111111111111\",\n name: \"Acme Customer App\",\n website_url: \"https://acme.example\",\n redirect_uris: [\"https://acme.example/callback\"],\n terms_url: \"https://acme.example/terms\",\n privacy_url: \"https://acme.example/privacy\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Use the access token that account.login returns.\nusing var client = new DiditClient(new DiditClientOptions { AccountToken = \"YOUR_ACCESS_TOKEN\" });\n\nvar result = await client.Account.Applications.CreateAsync(\"a1b2c3d4-5678-90ab-cdef-111111111111\", new ApplicationCreateRequest\n{\n Name = \"Acme Customer App\",\n WebsiteUrl = \"https://acme.example\",\n RedirectUris = new string[] { \"https://acme.example/callback\" },\n TermsUrl = \"https://acme.example/terms\",\n PrivacyUrl = \"https://acme.example/privacy\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] }, @@ -1203,6 +1328,43 @@ { "BearerAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Use the access token that account.login returns.\nclient = Didit(account_token=\"YOUR_ACCESS_TOKEN\")\n\nfor item in client.account.applications.list(\n \"a1b2c3d4-5678-90ab-cdef-111111111111\",\n):\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Use the access token that account.login returns.\nconst didit = new Didit({ accountToken: \"YOUR_ACCESS_TOKEN\" });\n\nfor await (const item of didit.account.applications.list(\"a1b2c3d4-5678-90ab-cdef-111111111111\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Use the access token that account.login returns.\nclient := didit.NewClient(option.WithAccountToken(\"YOUR_ACCESS_TOKEN\"))\n\niter := client.Account.Applications.ListAutoPaging(ctx, \"a1b2c3d4-5678-90ab-cdef-111111111111\", didit.AccountApplicationsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Use the access token that account.login returns.\nDidit client = Didit.builder().accountToken(\"YOUR_ACCESS_TOKEN\").build();\n\nfor (var item : client.account().applications().list(\"a1b2c3d4-5678-90ab-cdef-111111111111\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "account->applications->list('a1b2c3d4-5678-90ab-cdef-111111111111') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Use the access token that account.login returns.\ndidit = Didit::Client.new(account_token: \"YOUR_ACCESS_TOKEN\")\n\ndidit.account.applications.list(\"a1b2c3d4-5678-90ab-cdef-111111111111\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Use the access token that account.login returns.\nusing var client = new DiditClient(new DiditClientOptions { AccountToken = \"YOUR_ACCESS_TOKEN\" });\n\nawait foreach (var item in await client.Account.Applications.ListAsync(\"a1b2c3d4-5678-90ab-cdef-111111111111\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } ] } }, @@ -1388,12 +1550,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.get(\n f\"https://apx.didit.me/auth/v2/organizations/me/{org_id}/applications/{app_id}/\",\n headers={\"Authorization\": f\"Bearer {access_token}\"},\n timeout=10,\n)\nresp.raise_for_status()\napp = resp.json()\napi_key = app[\"api_key\"] # use as x-api-key on verification.didit.me" + "source": "from didit import Didit\n\n# Use the access token that account.login returns.\nclient = Didit(account_token=\"YOUR_ACCESS_TOKEN\")\n\nresult = client.account.applications.retrieve(\n \"a1b2c3d4-5678-90ab-cdef-111111111111\",\n \"b2c3d4e5-6789-01bc-defg-222222222222\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch(\n `https://apx.didit.me/auth/v2/organizations/me/${orgId}/applications/${appId}/`,\n { headers: { Authorization: `Bearer ${accessToken}` } },\n);\nif (!resp.ok) throw new Error(`Get app failed: ${resp.status}`);\nconst app = await resp.json();\nconst apiKey = app.api_key; // use as x-api-key on verification.didit.me" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Use the access token that account.login returns.\nconst didit = new Didit({ accountToken: \"YOUR_ACCESS_TOKEN\" });\n\nconst result = await didit.account.applications.retrieve(\n \"a1b2c3d4-5678-90ab-cdef-111111111111\",\n \"b2c3d4e5-6789-01bc-defg-222222222222\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Use the access token that account.login returns.\nclient := didit.NewClient(option.WithAccountToken(\"YOUR_ACCESS_TOKEN\"))\n\nresult, err := client.Account.Applications.Retrieve(ctx, \"a1b2c3d4-5678-90ab-cdef-111111111111\", \"b2c3d4e5-6789-01bc-defg-222222222222\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Use the access token that account.login returns.\nDidit client = Didit.builder().accountToken(\"YOUR_ACCESS_TOKEN\").build();\n\nvar result = client.account().applications().retrieve(\"a1b2c3d4-5678-90ab-cdef-111111111111\", \"b2c3d4e5-6789-01bc-defg-222222222222\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "account->applications->retrieve('a1b2c3d4-5678-90ab-cdef-111111111111', 'b2c3d4e5-6789-01bc-defg-222222222222');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Use the access token that account.login returns.\ndidit = Didit::Client.new(account_token: \"YOUR_ACCESS_TOKEN\")\n\nresult = didit.account.applications.retrieve(\n \"a1b2c3d4-5678-90ab-cdef-111111111111\",\n \"b2c3d4e5-6789-01bc-defg-222222222222\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Use the access token that account.login returns.\nusing var client = new DiditClient(new DiditClientOptions { AccountToken = \"YOUR_ACCESS_TOKEN\" });\n\nvar result = await client.Account.Applications.RetrieveAsync(\"a1b2c3d4-5678-90ab-cdef-111111111111\", \"b2c3d4e5-6789-01bc-defg-222222222222\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] }, @@ -1633,12 +1820,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.patch(\n f\"https://apx.didit.me/auth/v2/organizations/me/{org_id}/applications/{app_id}/\",\n headers={\"Authorization\": f\"Bearer {access_token}\"},\n json={\n \"name\": \"Acme Production App\",\n \"website_url\": \"https://app.acme.example\",\n },\n timeout=10,\n)\nresp.raise_for_status()\nupdated = resp.json()" + "source": "from didit import Didit\n\n# Use the access token that account.login returns.\nclient = Didit(account_token=\"YOUR_ACCESS_TOKEN\")\n\nresult = client.account.applications.update(\n \"a1b2c3d4-5678-90ab-cdef-111111111111\",\n \"b2c3d4e5-6789-01bc-defg-222222222222\",\n name=\"Acme Production App\",\n website_url=\"https://app.acme.example\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch(\n `https://apx.didit.me/auth/v2/organizations/me/${orgId}/applications/${appId}/`,\n {\n method: \"PATCH\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: \"Acme Production App\",\n website_url: \"https://app.acme.example\",\n }),\n },\n);\nif (!resp.ok) throw new Error(`Update app failed: ${resp.status}`);\nconst updated = await resp.json();" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Use the access token that account.login returns.\nconst didit = new Didit({ accountToken: \"YOUR_ACCESS_TOKEN\" });\n\nconst result = await didit.account.applications.update(\n \"a1b2c3d4-5678-90ab-cdef-111111111111\",\n \"b2c3d4e5-6789-01bc-defg-222222222222\",\n {\n name: \"Acme Production App\",\n website_url: \"https://app.acme.example\",\n },\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Use the access token that account.login returns.\nclient := didit.NewClient(option.WithAccountToken(\"YOUR_ACCESS_TOKEN\"))\n\nresult, err := client.Account.Applications.Update(ctx, \"a1b2c3d4-5678-90ab-cdef-111111111111\", \"b2c3d4e5-6789-01bc-defg-222222222222\", didit.ApplicationUpdateRequest{\n\tName: didit.String(\"Acme Production App\"),\n\tWebsiteURL: didit.String(\"https://app.acme.example\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.ApplicationUpdateRequest;\n\n// Use the access token that account.login returns.\nDidit client = Didit.builder().accountToken(\"YOUR_ACCESS_TOKEN\").build();\n\nvar result = client.account().applications().update(\"a1b2c3d4-5678-90ab-cdef-111111111111\", \"b2c3d4e5-6789-01bc-defg-222222222222\", ApplicationUpdateRequest.builder()\n .name(\"Acme Production App\")\n .websiteUrl(\"https://app.acme.example\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "account->applications->update('a1b2c3d4-5678-90ab-cdef-111111111111', 'b2c3d4e5-6789-01bc-defg-222222222222', [\n 'name' => 'Acme Production App',\n 'website_url' => 'https://app.acme.example',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Use the access token that account.login returns.\ndidit = Didit::Client.new(account_token: \"YOUR_ACCESS_TOKEN\")\n\nresult = didit.account.applications.update(\n \"a1b2c3d4-5678-90ab-cdef-111111111111\",\n \"b2c3d4e5-6789-01bc-defg-222222222222\",\n name: \"Acme Production App\",\n website_url: \"https://app.acme.example\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Use the access token that account.login returns.\nusing var client = new DiditClient(new DiditClientOptions { AccountToken = \"YOUR_ACCESS_TOKEN\" });\n\nvar result = await client.Account.Applications.UpdateAsync(\"a1b2c3d4-5678-90ab-cdef-111111111111\", \"b2c3d4e5-6789-01bc-defg-222222222222\", new ApplicationUpdateRequest\n{\n Name = \"Acme Production App\",\n WebsiteUrl = \"https://app.acme.example\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -1761,6 +1973,43 @@ }, "security": [ {} + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# This call needs no API key.\nclient = Didit()\n\nresult = client.account.resend_otp(\n email=\"dev@example.com\",\n password=\"S3cure-Passw0rd!\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// This call needs no API key.\nconst didit = new Didit();\n\nconst result = await didit.account.resendOtp({\n email: \"dev@example.com\",\n password: \"S3cure-Passw0rd!\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// This call needs no API key.\nclient := didit.NewClient()\n\nresult, err := client.Account.ResendOTP(ctx, didit.AccountResendOTPParams{\n\tEmail: \"dev@example.com\",\n\tPassword: \"S3cure-Passw0rd!\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.AccountResendOtpParams;\n\n// This call needs no API key.\nDidit client = new Didit();\n\nvar result = client.account().resendOtp(AccountResendOtpParams.builder()\n .email(\"dev@example.com\")\n .password(\"S3cure-Passw0rd!\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "account->resendOtp([\n 'email' => 'dev@example.com',\n 'password' => 'S3cure-Passw0rd!',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# This call needs no API key.\ndidit = Didit::Client.new\n\nresult = didit.account.resend_otp(\n email: \"dev@example.com\",\n password: \"S3cure-Passw0rd!\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// This call needs no API key.\nusing var client = new DiditClient();\n\nvar result = await client.Account.ResendOtpAsync(new AccountResendOtpParams\n{\n Email = \"dev@example.com\",\n Password = \"S3cure-Passw0rd!\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } } diff --git a/openapi/verification.json b/openapi/verification.json index 7736883..304dada 100644 --- a/openapi/verification.json +++ b/openapi/verification.json @@ -119,12 +119,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/email/risk/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"], \"Content-Type\": \"application/json\"},\n json={\n \"email\": \"alice@example.com\",\n \"country_code\": \"US\",\n \"vendor_data\": \"lead-123\",\n \"metadata\": {\"source\": \"signup_prescreen\"},\n },\n timeout=15,\n)\nresp.raise_for_status()\nresult = resp.json()\nprint(result[\"status\"]) # Approved / In Review / Declined\nprint(result[\"email\"][\"is_breached\"], result[\"email\"][\"is_disposable\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.email.assess_risk(\n email=\"alice@example.com\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/email/risk/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email: 'alice@example.com',\n country_code: 'US',\n vendor_data: 'lead-123',\n metadata: { source: 'signup_prescreen' },\n }),\n});\nconst data = await res.json();\nconsole.log(data.status, data.email.is_breached, data.email.is_disposable);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.email.assessRisk({\n email: \"alice@example.com\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Email.AssessRisk(ctx, didit.EmailRiskRequest{\n\tEmail: \"alice@example.com\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.EmailRiskRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.email().assessRisk(EmailRiskRequest.builder()\n .email(\"alice@example.com\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "email->assessRisk([\n 'email' => 'alice@example.com',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.email.assess_risk(email: \"alice@example.com\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Email.AssessRiskAsync(new EmailRiskRequest\n{\n Email = \"alice@example.com\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -267,8 +292,12 @@ "is_breached": true, "no_of_breaches": 4, "reason_codes": [ - "BREACH_EXPOSURE", - "FREQUENT_BREACH" + { + "code": "IR-F784B630", + "direction": "risk", + "message": "Email's digital footprint diversity is Very Low", + "impact_level": "low" + } ] }, "enrichment": { @@ -283,8 +312,12 @@ "is_breached": true, "no_of_breaches": 4, "reason_codes": [ - "BREACH_EXPOSURE", - "FREQUENT_BREACH" + { + "code": "IR-F784B630", + "direction": "risk", + "message": "Email's digital footprint diversity is Very Low", + "impact_level": "low" + } ] } }, @@ -337,12 +370,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/ip/risk/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"], \"Content-Type\": \"application/json\"},\n json={\n \"ip_address\": \"8.8.8.8\",\n \"claimed_country\": \"ESP\",\n \"user_agent\": \"Mozilla/5.0\",\n \"vendor_data\": \"lead-123\",\n },\n timeout=15,\n)\nresp.raise_for_status()\nresult = resp.json()\nprint(result[\"status\"]) # Approved / In Review\nprint(result[\"ip\"][\"ip_country_code\"], result[\"ip\"][\"country_mismatch\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.ip.assess_risk(\n ip_address=\"8.8.8.8\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/ip/risk/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n ip_address: '8.8.8.8',\n claimed_country: 'ESP',\n user_agent: 'Mozilla/5.0',\n vendor_data: 'lead-123',\n }),\n});\nconst data = await res.json();\nconsole.log(data.status, data.ip.country_mismatch);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.ip.assessRisk({\n ip_address: \"8.8.8.8\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IP.AssessRisk(ctx, didit.IPRiskRequest{\n\tIPAddress: \"8.8.8.8\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.IPRiskRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.ip().assessRisk(IPRiskRequest.builder()\n .ipAddress(\"8.8.8.8\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "ip->assessRisk([\n 'ip_address' => '8.8.8.8',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.ip.assess_risk(ip_address: \"8.8.8.8\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Ip.AssessRiskAsync(new IPRiskRequest\n{\n IpAddress = \"8.8.8.8\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -497,12 +555,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/phone/risk/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"], \"Content-Type\": \"application/json\"},\n json={\n \"phone_number\": \"+14155552671\",\n \"country_code\": \"US\",\n \"vendor_data\": \"lead-123\",\n \"metadata\": {\"source\": \"signup_prescreen\"},\n },\n timeout=15,\n)\nresp.raise_for_status()\nresult = resp.json()\nprint(result[\"status\"]) # Approved / In Review / Declined\nprint(result[\"phone\"][\"phone_intelligence\"][\"score\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.phone.assess_risk(\n phone_number=\"+14155552671\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/phone/risk/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n phone_number: '+14155552671',\n country_code: 'US',\n vendor_data: 'lead-123',\n metadata: { source: 'signup_prescreen' },\n }),\n});\nconst data = await res.json();\nconsole.log(data.status, data.phone.phone_intelligence?.score);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.phone.assessRisk({\n phone_number: \"+14155552671\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Phone.AssessRisk(ctx, didit.PhoneRiskRequest{\n\tPhoneNumber: \"+14155552671\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.PhoneRiskRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.phone().assessRisk(PhoneRiskRequest.builder()\n .phoneNumber(\"+14155552671\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "phone->assessRisk([\n 'phone_number' => '+14155552671',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.phone.assess_risk(phone_number: \"+14155552671\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Phone.AssessRiskAsync(new PhoneRiskRequest\n{\n PhoneNumber = \"+14155552671\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -640,8 +723,12 @@ "is_recently_ported": true, "carrier_type": "voip", "reason_codes": [ - "DISPOSABLE_NUMBER", - "RECENT_PORT" + { + "code": "IR-5AC67A32", + "direction": "risk", + "message": "Phone type identified as non-mobile", + "impact_level": "medium" + } ] }, "enrichment": { @@ -654,8 +741,12 @@ "is_recently_ported": true, "carrier_type": "voip", "reason_codes": [ - "DISPOSABLE_NUMBER", - "RECENT_PORT" + { + "code": "IR-5AC67A32", + "direction": "risk", + "message": "Phone type identified as non-mobile", + "impact_level": "medium" + } ] } }, @@ -843,7 +934,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation (missing or unknown `workflow_id`, invalid `language`, blocklisted `vendor_data`, malformed `portrait_image`, `address` without `country`/`poa_country`, invalid `sandbox_scenario`, `sign` documents, fields or values the workflow's Electronic Signature step refuses, such as `signature_document_not_supported`, `signature_document_conversion_failed`, `field_anchor_not_found` or `field_value_missing`, etc.) or your organization does not have enough credits to start the session.\n\nThe body is an object keyed by the offending field name (or `detail` for non-field errors). Values are an **array of strings** for input-validation failures (e.g. missing required field, invalid language, oversized portrait image) and a **plain string** for failures detected while creating the session (unknown `workflow_id`, blocklisted `vendor_data`, no reference face available for a Face Match workflow). Handle both shapes.", + "description": "Bad request — the payload failed validation (missing or unknown `workflow_id`, invalid `language`, blocklisted `vendor_data`, malformed `portrait_image`, `address` without `country`/`poa_country`, invalid `sandbox_scenario`, `sign` documents, fields or values the workflow's E-signature step refuses, such as `signature_document_not_supported`, `signature_document_conversion_failed`, `field_anchor_not_found` or `field_value_missing`, etc.) or your organization does not have enough credits to start the session.\n\nThe body is an object keyed by the offending field name (or `detail` for non-field errors). Values are an **array of strings** for input-validation failures (e.g. missing required field, invalid language, oversized portrait image) and a **plain string** for failures detected while creating the session (unknown `workflow_id`, blocklisted `vendor_data`, no reference face available for a Face Match workflow). Handle both shapes.", "content": { "application/json": { "schema": { @@ -909,7 +1000,7 @@ } }, "403": { - "description": "Authentication or authorization failed. The endpoint returns `403` whenever the `x-api-key` header is missing, malformed, the API key has expired, or the API key is valid but the client does not have permission to create sessions in this application (for example the API key belongs to a different organization). These failures share the body `{\"detail\": \"You do not have permission to perform this action.\"}`. Check that the `x-api-key` header is present and belongs to the intended application, re-fetch the application API key via the [Auth API](/auth-api/get-credentials) if needed, and retry.\n\n**Deleted application:** for a few minutes after an application is deleted, a request made with one of its API keys can answer `{\"detail\": \"This application was deleted.\", \"code\": \"application_deleted\"}`. Do not retry: the application and its API keys no longer exist. After those few minutes, the key is refused like any other invalid key.", + "description": "Authentication or authorization failed. A wrong, revoked or expired key returns `401`. The endpoint returns `403` when the `x-api-key` header is missing or the API key is valid but the client does not have permission to create sessions in this application (for example the API key belongs to a different organization). These failures share the body `{\"detail\": \"You do not have permission to perform this action.\"}`. Check that the `x-api-key` header is present and belongs to the intended application, re-fetch the application API key via the [Auth API](/auth-api/get-credentials) if needed, and retry.\n\n**Deleted application:** for a few minutes after an application is deleted, a request made with one of its API keys can answer `{\"detail\": \"This application was deleted.\", \"code\": \"application_deleted\"}`. Do not retry: the application and its API keys no longer exist. After those few minutes, the key is refused like any other invalid key.", "content": { "application/json": { "schema": { @@ -1032,12 +1123,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nurl = \"https://verification.didit.me/v3/session/\"\nheaders = {\n 'x-api-key': 'YOUR_API_KEY',\n \"Content-Type\": \"application/json\",\n}\npayload = {\n \"workflow_id\": \"11111111-2222-3333-4444-555555555555\",\n \"vendor_data\": \"user-123\",\n \"callback\": \"https://example.com/verification/callback\",\n \"callback_method\": \"both\",\n \"metadata\": {\"user_type\": \"premium\", \"account_id\": \"ABC123\"},\n \"language\": \"en\",\n \"contact_details\": {\n \"email\": \"john.doe@example.com\",\n \"send_notification_emails\": True,\n \"email_lang\": \"en\",\n \"phone\": \"+14155552671\",\n },\n \"expected_details\": {\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"date_of_birth\": \"1990-05-15\",\n \"id_country\": \"USA\",\n \"expected_document_types\": [\"P\", \"ID\"],\n },\n}\n\nresponse = requests.post(url, json=payload, headers=headers, timeout=15)\nresponse.raise_for_status()\nsession = response.json()\nprint(session[\"session_id\"], session[\"url\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.create(\n workflow_id=\"11111111-2222-3333-4444-555555555555\",\n vendor_data=\"user-123\",\n callback=\"https://example.com/verification/callback\",\n callback_method=\"both\",\n metadata={\"user_type\": \"premium\", \"account_id\": \"ABC123\"},\n language=\"en\",\n contact_details={\n \"email\": \"john.doe@example.com\",\n \"send_notification_emails\": True,\n \"email_lang\": \"en\",\n \"phone\": \"+14155552671\",\n },\n expected_details={\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"date_of_birth\": \"1990-05-15\",\n \"nationality\": \"USA\",\n \"id_country\": \"USA\",\n \"expected_document_types\": [\"P\", \"ID\"],\n },\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const response = await fetch('https://verification.didit.me/v3/session/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n workflow_id: '11111111-2222-3333-4444-555555555555',\n vendor_data: 'user-123',\n callback: 'https://example.com/verification/callback',\n callback_method: 'both',\n metadata: { user_type: 'premium', account_id: 'ABC123' },\n language: 'en',\n contact_details: {\n email: 'john.doe@example.com',\n send_notification_emails: true,\n email_lang: 'en',\n phone: '+14155552671',\n },\n expected_details: {\n first_name: 'John',\n last_name: 'Doe',\n date_of_birth: '1990-05-15',\n id_country: 'USA',\n expected_document_types: ['P', 'ID'],\n },\n }),\n});\n\nif (!response.ok) {\n throw new Error(`Session create failed: ${response.status}`);\n}\nconst session = await response.json();\nconsole.log(session.session_id, session.url);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.create({\n workflow_id: \"11111111-2222-3333-4444-555555555555\",\n vendor_data: \"user-123\",\n callback: \"https://example.com/verification/callback\",\n callback_method: \"both\",\n metadata: { user_type: \"premium\", account_id: \"ABC123\" },\n language: \"en\",\n contact_details: {\n email: \"john.doe@example.com\",\n send_notification_emails: true,\n email_lang: \"en\",\n phone: \"+14155552671\",\n },\n expected_details: {\n first_name: \"John\",\n last_name: \"Doe\",\n date_of_birth: \"1990-05-15\",\n nationality: \"USA\",\n id_country: \"USA\",\n expected_document_types: [\"P\", \"ID\"],\n },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Create(ctx, didit.SessionsCreateParams{\n\tWorkflowID: \"11111111-2222-3333-4444-555555555555\",\n\tVendorData: didit.String(\"user-123\"),\n\tCallback: didit.String(\"https://example.com/verification/callback\"),\n\tCallbackMethod: didit.Some(didit.SessionsCreateParamsCallbackMethod(\"both\")),\n\tMetadata: didit.Some[any](map[string]any{\"user_type\": \"premium\", \"account_id\": \"ABC123\"}),\n\tLanguage: didit.Some(didit.SessionsCreateParamsLanguage(\"en\")),\n\tContactDetails: didit.Some(didit.SessionsCreateParamsContactDetails{\n\t\tEmail: didit.String(\"john.doe@example.com\"),\n\t\tSendNotificationEmails: didit.Bool(true),\n\t\tEmailLang: didit.Some(didit.SessionsCreateParamsContactDetailsEmailLang(\"en\")),\n\t\tPhone: didit.String(\"+14155552671\"),\n\t}),\n\tExpectedDetails: didit.Some(didit.SessionsCreateParamsExpectedDetails{\n\t\tFirstName: didit.String(\"John\"),\n\t\tLastName: didit.String(\"Doe\"),\n\t\tDateOfBirth: didit.String(\"1990-05-15\"),\n\t\tNationality: didit.String(\"USA\"),\n\t\tIDCountry: didit.String(\"USA\"),\n\t\tExpectedDocumentTypes: didit.Some([]didit.SessionsCreateParamsExpectedDetailsExpectedDocumentTypes{\"P\", \"ID\"}),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.LocalDate;\nimport java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().create(SessionsCreateParams.builder()\n .workflowId(\"11111111-2222-3333-4444-555555555555\")\n .vendorData(\"user-123\")\n .callback(\"https://example.com/verification/callback\")\n .callbackMethod(SessionsCreateParams.CallbackMethod.of(\"both\"))\n .metadata(Map.of(\"user_type\", \"premium\", \"account_id\", \"ABC123\"))\n .language(SessionsCreateParams.Language.of(\"en\"))\n .contactDetails(SessionsCreateParams.ContactDetails.builder()\n .email(\"john.doe@example.com\")\n .sendNotificationEmails(true)\n .emailLang(SessionsCreateParams.ContactDetails.EmailLang.of(\"en\"))\n .phone(\"+14155552671\")\n .build())\n .expectedDetails(SessionsCreateParams.ExpectedDetails.builder()\n .firstName(\"John\")\n .lastName(\"Doe\")\n .dateOfBirth(LocalDate.parse(\"1990-05-15\"))\n .nationality(\"USA\")\n .idCountry(\"USA\")\n .expectedDocumentTypes(List.of(SessionsCreateParams.ExpectedDetails.ExpectedDocumentTypes.of(\"P\"), SessionsCreateParams.ExpectedDetails.ExpectedDocumentTypes.of(\"ID\")))\n .build())\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->create([\n 'workflow_id' => '11111111-2222-3333-4444-555555555555',\n 'vendor_data' => 'user-123',\n 'callback' => 'https://example.com/verification/callback',\n 'callback_method' => 'both',\n 'metadata' => ['user_type' => 'premium', 'account_id' => 'ABC123'],\n 'language' => 'en',\n 'contact_details' => [\n 'email' => 'john.doe@example.com',\n 'send_notification_emails' => true,\n 'email_lang' => 'en',\n 'phone' => '+14155552671',\n ],\n 'expected_details' => [\n 'first_name' => 'John',\n 'last_name' => 'Doe',\n 'date_of_birth' => '1990-05-15',\n 'nationality' => 'USA',\n 'id_country' => 'USA',\n 'expected_document_types' => ['P', 'ID'],\n ],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.create(\n workflow_id: \"11111111-2222-3333-4444-555555555555\",\n vendor_data: \"user-123\",\n callback: \"https://example.com/verification/callback\",\n callback_method: \"both\",\n metadata: { user_type: \"premium\", account_id: \"ABC123\" },\n language: \"en\",\n contact_details: {\n email: \"john.doe@example.com\",\n send_notification_emails: true,\n email_lang: \"en\",\n phone: \"+14155552671\",\n },\n expected_details: {\n first_name: \"John\",\n last_name: \"Doe\",\n date_of_birth: \"1990-05-15\",\n nationality: \"USA\",\n id_country: \"USA\",\n expected_document_types: [\"P\", \"ID\"],\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.CreateAsync(new SessionsCreateParams\n{\n WorkflowId = \"11111111-2222-3333-4444-555555555555\",\n VendorData = \"user-123\",\n Callback = \"https://example.com/verification/callback\",\n CallbackMethod = new SessionsCreateParamsCallbackMethod(\"both\"),\n Metadata = new Dictionary { [\"user_type\"] = \"premium\", [\"account_id\"] = \"ABC123\" },\n Language = new SessionsCreateParamsLanguage(\"en\"),\n ContactDetails = new SessionsCreateParamsContactDetails\n {\n Email = \"john.doe@example.com\",\n SendNotificationEmails = true,\n EmailLang = new SessionsCreateParamsContactDetailsEmailLang(\"en\"),\n Phone = \"+14155552671\",\n },\n ExpectedDetails = new SessionsCreateParamsExpectedDetails\n {\n FirstName = \"John\",\n LastName = \"Doe\",\n DateOfBirth = \"1990-05-15\",\n Nationality = \"USA\",\n IdCountry = \"USA\",\n ExpectedDocumentTypes = new SessionsCreateParamsExpectedDetailsExpectedDocumentTypes[] { \"P\", \"ID\" },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -1063,6 +1179,12 @@ "example": "user-123", "x-readme-id": "0.1" }, + "multi_account_segment": { + "type": "string", + "maxLength": 64, + "description": "Optional duplicate-detection realm inside your organization. Duplicate face checks compare this session only with other sessions that carry the same segment, so separate account bases (personal and business accounts, or one per B2B sub-client) do not flag a person who legitimately holds one account in each. Omit it to use the single default realm, which is what every session uses today. Blocklist and allowlist matching ignore this field.", + "example": "business-accounts" + }, "callback": { "type": "string", "description": "URL to redirect the user to after verification completes. Didit automatically appends `verificationSessionId` and `status` (Approved, Declined, In Review) as query parameters. Custom URL schemes (e.g. `myapp://`) are supported for mobile callbacks. If omitted, the workflow's default `callback_url` is used. When the application has allowed domains (`allowed_domains` on `PATCH /v3/webhook/`), an `http` or `https` callback must be on one of those origins (same scheme, host and port), otherwise the request fails with 400 on `callback`: `callback must be on one of the application's allowed domains: https://app.example.com`. Custom URL schemes are always accepted.", @@ -1406,7 +1528,7 @@ }, "sign": { "type": "object", - "description": "Electronic Signature input for this session. `documents` are the documents to sign, for a workflow whose Electronic Signature step takes documents from the session (`signature_documents_source` `session` or `both`): up to 20 documents and 50 MB in total. `field_values` fills the fields whose `prefill` is `api.`, on workflow and session documents alike. Creating a session again for the same `workflow_id` and `vendor_data` returns the pending session; if that call sends `sign`, its documents, fields and values must be identical to the first ones, and anything different returns `400` with `{\"sign\": \"signature_document_changed\"}`. See [Electronic signature documents](/sessions-api/create-session#electronic-signature-documents).", + "description": "E-signature input for this session. `documents` are the documents to sign, for a workflow whose E-signature step takes documents from the session (`signature_documents_source` `session` or `both`): up to 20 documents and 50 MB in total. `field_values` fills the fields whose `prefill` is `api.`, on workflow and session documents alike. Creating a session again for the same `workflow_id` and `vendor_data` returns the pending session; if that call sends `sign`, its documents, fields and values must be identical to the first ones, and anything different returns `400` with `{\"sign\": \"signature_document_changed\"}`. See [E-signature documents](/sessions-api/create-session#e-signature-documents).", "properties": { "documents": { "type": "array", @@ -1901,7 +2023,7 @@ } }, "403": { - "description": "Imports not enabled, sandbox application, or missing/invalid API key (this endpoint returns `403`, never `401`, for authentication failures). Verification imports are disabled by default and must be enabled per organization by Didit.", + "description": "Imports not enabled, sandbox application, or missing API key (a wrong, revoked or expired key gets `401`). Verification imports are disabled by default and must be enabled per organization by Didit.", "content": { "application/json": { "examples": { @@ -1943,6 +2065,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.create(\n import_type=\"user_verification\",\n workflow_id=\"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n source_file_url=\"https://files.example.com/exports/sessions.ndjson\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.create({\n import_type: \"user_verification\",\n workflow_id: \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n source_file_url: \"https://files.example.com/exports/sessions.ndjson\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Create(ctx, didit.SessionsImportsCreateParams{\n\tImportType: didit.Some(didit.SessionsImportsCreateParamsImportType(\"user_verification\")),\n\tWorkflowID: didit.String(\"9f9b1234-aaaa-bbbb-cccc-1234567890ab\"),\n\tSourceFileURL: didit.String(\"https://files.example.com/exports/sessions.ndjson\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsImportsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().create(SessionsImportsCreateParams.builder()\n .importType(SessionsImportsCreateParams.ImportType.of(\"user_verification\"))\n .workflowId(\"9f9b1234-aaaa-bbbb-cccc-1234567890ab\")\n .sourceFileUrl(\"https://files.example.com/exports/sessions.ndjson\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->create([\n 'import_type' => 'user_verification',\n 'workflow_id' => '9f9b1234-aaaa-bbbb-cccc-1234567890ab',\n 'source_file_url' => 'https://files.example.com/exports/sessions.ndjson',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.create(\n import_type: \"user_verification\",\n workflow_id: \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n source_file_url: \"https://files.example.com/exports/sessions.ndjson\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.CreateAsync(new SessionsImportsCreateParams\n{\n ImportType = new SessionsImportsCreateParamsImportType(\"user_verification\"),\n WorkflowId = \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n SourceFileUrl = \"https://files.example.com/exports/sessions.ndjson\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -1990,7 +2149,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot download import templates. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot download import templates. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -2009,6 +2168,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.imports.retrieve_template()\nwith open(\"download.csv\", \"wb\") as file:\n file.write(content)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.imports.retrieveTemplate();\nawait writeFile(\"download.csv\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.Imports.RetrieveTemplate(ctx, didit.SessionsImportsRetrieveTemplateParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.csv\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().imports().retrieveTemplate()\n .writeTo(Path.of(\"download.csv\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->retrieveTemplate();\n$content->saveTo('download.csv');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.imports.retrieve_template\nFile.binwrite(\"download.csv\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.Imports.RetrieveTemplateAsync();\nawait content.SaveToAsync(\"download.csv\");" + } ] } }, @@ -2063,7 +2259,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot read import jobs for this application. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot read import jobs for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -2082,6 +2278,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.retrieve(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -2202,7 +2435,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot read import jobs for this application. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot read import jobs for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -2221,13 +2454,50 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.sessions.imports.list_errors(\n \"11111111-2222-3333-4444-555555555555\",\n):\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.sessions.imports.listErrors(\"11111111-2222-3333-4444-555555555555\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.Imports.ListErrorsAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsImportsListErrorsParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.sessions().imports().listErrors(\"11111111-2222-3333-4444-555555555555\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->listErrors('11111111-2222-3333-4444-555555555555') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.imports.list_errors(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Sessions.Imports.ListErrorsAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } ] } }, "/v3/session/{sessionId}/decision/": { "get": { "summary": "Retrieve the full decision for a verification session", - "description": "Retrieve the complete decision report for a verification session — the rolled-up session `status` plus one report per verification feature the workflow executed. This is the canonical read endpoint for both User Verification (KYC) and Business Verification (KYB) sessions: the same path serves both, and the top-level `session_kind` discriminator tells you which shape you received (`\"user\"` or `\"business\"`).\n\n**Every feature report is a plural array.** V3 workflows are graphs that can run the same feature more than once, so each block (`id_verifications`, `nfc_verifications`, `liveness_checks`, `face_matches`, `poa_verifications`, `document_ai_documents`, `phone_verifications`, `email_verifications`, `aml_screenings`, `ip_analyses`, `database_validations`, `questionnaire_responses`) is a JSON array whose items each carry a `node_id` identifying the workflow graph node that produced them. Read NFC as `response.nfc_verifications[0]` — never as a singular `nfc` field. A block is `null` until the workflow has run that feature at least once; features the workflow does not include never appear with data. Electronic Signature results are in `signatures`, which is present only when the workflow has an Electronic Signature step.\n\n**When to call.** The recommended pattern is event-driven: wait for the `status.updated` webhook that fires when the session reaches a decision (`Approved`, `Declined`, `In Review`), then call this endpoint once to fetch the full report. Polling also works — the endpoint can be called at any point in the session lifecycle and returns the data produced so far — but webhook-then-fetch is cheaper and faster. Media URLs in the response (document images, videos, PDFs) are short-lived presigned links: fetch them promptly or re-request the decision to get fresh ones, and do not persist them as long-term references.\n\n**Statuses.** The top-level `status` is the session lifecycle status (`Not Started`, `In Progress`, `Awaiting User`, `In Review`, `Approved`, `Declined`, `Resubmitted`, `Expired`, `Kyc Expired`, `Abandoned`). Each feature item additionally carries its own feature-level `status` (`Not Finished`, `Approved`, `Declined`, `In Review`, ...). A session can be `Approved` overall while an individual feature is `In Review`, depending on the workflow's decision rules.\n\n**Authentication and visibility.** Authenticate with the application API key in the `x-api-key` header (a console user Bearer token with the `read:sessions` permission also works). Only sessions owned by the authenticated application are visible. If your workflow restricts response attributes, non-allowed fields inside feature items are returned as `null` while `status`, `warnings`, and `node_id` are always preserved.\n\n**Rate limits.** GET requests are limited to 600 per minute per API key. Exceeding the limit returns `429` with `Retry-After` and `X-RateLimit-*` headers.", + "description": "Retrieve the complete decision report for a verification session — the rolled-up session `status` plus one report per verification feature the workflow executed. This is the canonical read endpoint for both User Verification (KYC) and Business Verification (KYB) sessions: the same path serves both, and the top-level `session_kind` discriminator tells you which shape you received (`\"user\"` or `\"business\"`).\n\n**Every feature report is a plural array.** V3 workflows are graphs that can run the same feature more than once, so each block (`id_verifications`, `nfc_verifications`, `liveness_checks`, `face_matches`, `poa_verifications`, `document_ai_documents`, `phone_verifications`, `email_verifications`, `aml_screenings`, `ip_analyses`, `database_validations`, `questionnaire_responses`) is a JSON array whose items each carry a `node_id` identifying the workflow graph node that produced them. Read NFC as `response.nfc_verifications[0]` — never as a singular `nfc` field. A block is `null` until the workflow has run that feature at least once; features the workflow does not include never appear with data. E-signature results are in `signatures`, which is present only when the workflow has an E-signature step.\n\n**When to call.** The recommended pattern is event-driven: wait for the `status.updated` webhook that fires when the session reaches a decision (`Approved`, `Declined`, `In Review`), then call this endpoint once to fetch the full report. Polling also works — the endpoint can be called at any point in the session lifecycle and returns the data produced so far — but webhook-then-fetch is cheaper and faster. Media URLs in the response (document images, videos, PDFs) are short-lived presigned links: fetch them promptly or re-request the decision to get fresh ones, and do not persist them as long-term references.\n\n**Statuses.** The top-level `status` is the session lifecycle status (`Not Started`, `In Progress`, `Awaiting User`, `In Review`, `Approved`, `Declined`, `Resubmitted`, `Expired`, `Kyc Expired`, `Abandoned`). Each feature item additionally carries its own feature-level `status` (`Not Finished`, `Approved`, `Declined`, `In Review`, ...). A session can be `Approved` overall while an individual feature is `In Review`, depending on the workflow's decision rules.\n\n**Authentication and visibility.** Authenticate with the application API key in the `x-api-key` header (a console user Bearer token with the `read:sessions` permission also works). Only sessions owned by the authenticated application are visible. If your workflow restricts response attributes, non-allowed fields inside feature items are returned as `null` while `status`, `warnings`, and `node_id` are always preserved.\n\n**Rate limits.** GET requests are limited to 600 per minute per API key. Exceeding the limit returns `429` with `Retry-After` and `X-RateLimit-*` headers.", "operationId": "get_v3_session_decision", "x-didit-sdk": { "resource": "sessions", @@ -3413,7 +3683,7 @@ "entity_type": "person", "hits": [ { - "id": "cPtTGRKkyddAcAC4xgsLCm", + "id": "hit_7c1e9a40b2d35f86e0a4c912", "url": "https://news.example.org/articles/sample", "match": false, "score": 0.73, @@ -4092,21 +4362,7 @@ } ], "accounts": null, - "registry_data": { - "addresses_detail": [ - { - "type": "registered", - "address": "1 Example Street, London, EC1A 1AA", - "country": "GB" - } - ], - "industries": [ - { - "code": "62012", - "description": "Business and domestic software development" - } - ] - }, + "registry_data": {}, "user_provided_data": { "company_name": "ACME HOLDINGS", "registration_number": "12345678" @@ -4116,19 +4372,38 @@ "is_editable": false }, "ownership_structure": { - "nodes": [ - { - "id": "company", - "name": "ACME HOLDINGS LTD", - "type": "company" - }, + "shareholders": [ { - "id": "ubo-1", "name": "John Doe", - "type": "person", - "ownership_percent": 75.0 + "first_name": "John", + "last_name": "Doe", + "date_of_birth": null, + "country_of_birth": null, + "company_name": null, + "registration_number": null, + "entity_type": "person", + "nationality": null, + "designation": null, + "roles": [ + "shareholder" + ], + "ownership_min_shares": "75", + "ownership_max_shares": "75", + "voting_min_shares": null, + "voting_max_shares": null, + "appointment_date": null, + "is_active": true, + "shareholding": { + "share_class": "ORDINARY", + "number_of_shares": 750.0, + "currency": "GBP", + "nominal_value": 1.0, + "total_value": null, + "percentage": 75.0 + } } - ] + ], + "beneficial_owners": [] }, "warnings": [] } @@ -4436,7 +4711,7 @@ } }, "403": { - "description": "Authentication or authorization failed. **This endpoint never returns `401`** — Didit's API-key authentication does not emit a `WWW-Authenticate` challenge, so missing or invalid credentials also surface as `403`. Two `detail` strings distinguish the failure modes:\n\n- `\"Authentication credentials were not provided or are invalid.\"` — no `x-api-key` header (and no `Authorization: Bearer` token), or the supplied credential failed introspection (revoked, expired, or malformed).\n- `\"You do not have permission to perform this action.\"` — the credential is valid but not allowed to read this session: a console-user Bearer token lacks the `read:sessions` permission or cannot access the owning application, or an API key belongs to a different organization than the session.\n\nNote that for a completely unknown `sessionId` the endpoint resolves the owning application before validating credentials, so a missing session returns `404` even when the credential is missing or invalid.", + "description": "Authentication or authorization failed. A missing key returns `403`; a wrong, revoked or expired key returns `401`. Two `detail` strings distinguish the failure modes:\n\n- `\"Authentication credentials were not provided or are invalid.\"` — no `x-api-key` header (and no `Authorization: Bearer` token), or the supplied credential failed introspection (revoked, expired, or malformed).\n- `\"You do not have permission to perform this action.\"` — the credential is valid but not allowed to read this session: a console-user Bearer token lacks the `read:sessions` permission or cannot access the owning application, or an API key belongs to a different organization than the session.\n\nNote that for a completely unknown `sessionId` the endpoint resolves the owning application before validating credentials, so a missing session returns `404` even when the credential is missing or invalid.", "content": { "application/json": { "schema": { @@ -4594,12 +4869,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nsession_id = \"11111111-2222-3333-4444-555555555555\"\nurl = f\"https://verification.didit.me/v3/session/{session_id}/decision/\"\nheaders = {\n 'x-api-key': 'YOUR_API_KEY',\n \"Accept\": \"application/json\",\n}\n\nresponse = requests.get(url, headers=headers, timeout=15)\nresponse.raise_for_status()\ndecision = response.json()\n\nprint(\"session_kind:\", decision[\"session_kind\"])\nprint(\"top-level status:\", decision[\"status\"])\n\n# nfc_verifications is ALWAYS an array — never a singular `nfc` field.\nfor nfc in decision.get(\"nfc_verifications\") or []:\n print(\"nfc node_id:\", nfc[\"node_id\"], \"status:\", nfc[\"status\"])\n\nfor id_check in decision.get(\"id_verifications\") or []:\n print(\"id node_id:\", id_check[\"node_id\"], \"status:\", id_check[\"status\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.retrieve_decision(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const sessionId = '11111111-2222-3333-4444-555555555555';\nconst response = await fetch(\n `https://verification.didit.me/v3/session/${sessionId}/decision/`,\n {\n method: 'GET',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n Accept: 'application/json',\n },\n }\n);\n\nif (!response.ok) {\n throw new Error(`Decision fetch failed: ${response.status}`);\n}\nconst decision = await response.json();\n\nconsole.log('session_kind:', decision.session_kind);\nconsole.log('top-level status:', decision.status);\n\n// nfc_verifications is ALWAYS an array — never a singular `nfc` field.\nfor (const nfc of decision.nfc_verifications ?? []) {\n console.log('nfc node_id:', nfc.node_id, 'status:', nfc.status);\n}\n\nfor (const idCheck of decision.id_verifications ?? []) {\n console.log('id node_id:', idCheck.node_id, 'status:', idCheck.status);\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.retrieveDecision(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.RetrieveDecision(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsRetrieveDecisionParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().retrieveDecision(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->retrieveDecision('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.retrieve_decision(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.RetrieveDecisionAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -4607,7 +4907,7 @@ "/v3/session/{sessionId}/delete/": { "delete": { "summary": "Delete a verification session (KYC or KYB)", - "description": "Delete a single verification session, User Verification (KYC) or Business Verification (KYB), by its `session_id`. The id is resolved against KYC sessions first, then KYB sessions, so both kinds are deleted through this one URL.\n\n**What is deleted:**\n- The session and every verification attempt it holds, including results that a resubmission replaced: the decision, extracted data, all related feature records (ID verification, face, liveness, face match, AML, registry checks, IP analysis, and so on), its reviews and its activity log.\n- All stored files owned by the session: document front/back photos (full, cropped, and privacy-blurred variants), document-capture videos, portrait crops, NFC chip portrait and signature images, face reference images, liveness videos, face-match source/target images, Proof of Address documents, and any extra uploaded files (KYC); uploaded company documents and extra files (KYB). Electronic Signature documents, signed PDFs, evidence PDFs and signature images (KYC and KYB): their download paths stop working. Previously issued media URLs (`https:///...`) stop resolving.\n- The session's face data. Its face embedding is deleted too, unless you choose to keep an image-free template (see **Face biometric data**).\n- Webhook deliveries still queued for the session, and their retries. Webhooks already delivered are not affected.\n- For a Business Verification (KYB) session: the verifications it created for its key people (KYC) and its corporate owners (KYB), recursively, reported as `deleted_child_verifications`. A verification it only links to, such as an existing approved KYC it reused, is not deleted.\n\nThe session disappears from every read endpoint immediately: `GET /v3/session/{sessionId}/decision/` returns `404` and `GET /v3/sessions/` stops listing it. Ongoing AML monitoring and KYB registry monitoring started by the deleted verifications stop.\n\n**What is not affected:** blocklist entries created from this session (face or document) are **not** removed; manage those with the blocklist endpoints. Share tokens issued for the session are not revoked, but there is nothing left for them to import: an import with one returns `400` with `{\"share_token\": [\"Original session does not exist.\"]}`. Credits already consumed are **not** refunded. The parent User or Business entity is **not** deleted; use `POST /v3/users/delete/` or `POST /v3/businesses/delete/` for those. If the User's profile portrait came from this session, the portrait is removed with it.\n\n**Face biometric data:** by default the session's face embedding is deleted with the session (`face_retention_outcome: deleted`). An application that opted in to biometric-template retention (`face_retention_policy: retain_until_user_deleted` on `PATCH /v3/webhook/`), or a request with `retain_face_embeddings: true`, keeps one separately managed, image-free face biometric template anchored to the session's User (`retained_with_user`) so that duplicate detection, Face Search, and biometric authentication keep working. The template never contains the face image, media, identity fields, the decision, or the deleted session's id; it is biometric data deleted at `biometric_template_expires_at`, or earlier on User deletion, privacy erasure, or an explicit purge through `/v3/biometric-templates/`. A session without a linked User cannot retain a template (`ineligible_no_vendor_user`). Send `deletion_instruction: privacy_erasure` for data-subject requests: it purges every retained template for that User and never retains a new one.\n\n**Irreversible:** deletion is permanent and there is no restore endpoint. Export anything you need (for example a decision PDF) before you call it.\n\n**Side effects:** no webhook is emitted for deletions.\n\n**Response:** `200 OK` once the deletion has completed, with a JSON body reporting the `face_retention_outcome`, the retained template's expiry and, for a KYB session, `deleted_child_verifications`. Earlier versions of this endpoint returned `204 No Content`; update clients that assert on `204`. Keep your `instruction_id` in your own erasure log.\n\n**Idempotency:** not idempotent at the HTTP level: the first call returns `200`; repeating it returns `404` because the session no longer resolves. After a `503` the session is still in place; repeat the same request to finish deleting it.\n\n**Authentication:** send your application's API key in the `x-api-key` header; the session must belong to that application. Console user access tokens (`Authorization: Bearer ...`) may also call this endpoint when they carry the `delete:sessions` permission. Authentication and permission failures both return `403`; this API never returns `401`.\n\n**Rate limit:** shared write budget of 300 requests/min per API key across all POST/PATCH/DELETE endpoints; exceeding it returns `429`.\n\nTo bulk-delete KYC sessions by their numeric `session_number`, use `POST /v3/sessions/delete/` instead.\n\n**Filed regulatory reports:** if the selected data is in a finalized regulatory report, the whole request is refused with `409` and nothing is deleted. The body uses `code: in_filed_report` and names each report with `uuid`, `report_number`, `report_type` and `case_uuid`. Delete the reports, then repeat the request.", + "description": "Delete a single verification session, User Verification (KYC) or Business Verification (KYB), by its `session_id`. The id is resolved against KYC sessions first, then KYB sessions, so both kinds are deleted through this one URL.\n\n**What is deleted:**\n- The session and every verification attempt it holds, including results that a resubmission replaced: the decision, extracted data, all related feature records (ID verification, face, liveness, face match, AML, registry checks, IP analysis, and so on), its reviews and its activity log.\n- All stored files owned by the session: document front/back photos (full, cropped, and privacy-blurred variants), document-capture videos, portrait crops, NFC chip portrait and signature images, face reference images, liveness videos, face-match source/target images, Proof of Address documents, and any extra uploaded files (KYC); uploaded company documents and extra files (KYB). E-signature documents, signed PDFs, evidence PDFs and signature images (KYC and KYB): their download paths stop working. Previously issued media URLs (`https:///...`) stop resolving.\n- The session's face data. Its face embedding is deleted too, unless you choose to keep an image-free template (see **Face biometric data**).\n- Webhook deliveries still queued for the session, and their retries. Webhooks already delivered are not affected.\n- For a Business Verification (KYB) session: the verifications it created for its key people (KYC) and its corporate owners (KYB), recursively, reported as `deleted_child_verifications`. A verification it only links to, such as an existing approved KYC it reused, is not deleted.\n\nThe session disappears from every read endpoint immediately: `GET /v3/session/{sessionId}/decision/` returns `404` and `GET /v3/sessions/` stops listing it. Ongoing AML monitoring and KYB registry monitoring started by the deleted verifications stop.\n\n**What is not affected:** blocklist entries created from this session (face or document) are **not** removed; manage those with the blocklist endpoints. Share tokens issued for the session are not revoked, but there is nothing left for them to import: an import with one returns `400` with `{\"share_token\": [\"Original session does not exist.\"]}`. Credits already consumed are **not** refunded. The parent User or Business entity is **not** deleted; use `POST /v3/users/delete/` or `POST /v3/businesses/delete/` for those. If the User's profile portrait came from this session, the portrait is removed with it.\n\n**Face biometric data:** by default the session's face embedding is deleted with the session (`face_retention_outcome: deleted`). An application that opted in to biometric-template retention (`face_retention_policy: retain_until_user_deleted` on `PATCH /v3/webhook/`), or a request with `retain_face_embeddings: true`, keeps one separately managed, image-free face biometric template anchored to the session's User (`retained_with_user`) so that duplicate detection, Face Search, and biometric authentication keep working. The template never contains the face image, media, identity fields, the decision, or the deleted session's id; it is biometric data deleted at `biometric_template_expires_at`, or earlier on User deletion, privacy erasure, or an explicit purge through `/v3/biometric-templates/`. A session without a linked User cannot retain a template (`ineligible_no_vendor_user`). Send `deletion_instruction: privacy_erasure` for data-subject requests: it purges every retained template for that User and never retains a new one.\n\n**Irreversible:** deletion is permanent and there is no restore endpoint. Export anything you need (for example a decision PDF) before you call it.\n\n**Side effects:** no webhook is emitted for deletions.\n\n**Response:** `200 OK` once the deletion has completed, with a JSON body reporting the `face_retention_outcome`, the retained template's expiry and, for a KYB session, `deleted_child_verifications`. Earlier versions of this endpoint returned `204 No Content`; update clients that assert on `204`. Keep your `instruction_id` in your own erasure log.\n\n**Idempotency:** not idempotent at the HTTP level: the first call returns `200`; repeating it returns `404` because the session no longer resolves. After a `503` the session is still in place; repeat the same request to finish deleting it.\n\n**Authentication:** send your application's API key in the `x-api-key` header; the session must belong to that application. Console user access tokens (`Authorization: Bearer ...`) may also call this endpoint when they carry the `delete:sessions` permission. Authentication and permission failures both return `403`; this API never returns `401`.\n\n**Rate limit:** shared write budget of 300 requests/min per API key across all POST/PATCH/DELETE endpoints; exceeding it returns `429`.\n\nTo bulk-delete KYC sessions by their numeric `session_number`, use `POST /v3/sessions/delete/` instead.\n\n**Filed regulatory reports:** if the selected data is in a finalized regulatory report, the whole request is refused with `409` and nothing is deleted. The body uses `code: in_filed_report` and names each report with `uuid`, `report_number`, `report_type` and `case_uuid`. Delete the reports, then repeat the request.", "operationId": "delete_v3_session_by_id", "x-didit-sdk": { "resource": "sessions", @@ -4747,7 +5047,7 @@ } }, "403": { - "description": "Authentication or permission failure. Missing/invalid credentials also return `403` — this API never returns `401`. Exception: when the `sessionId` does not resolve to a live session, the pre-auth owner lookup returns `404` first, even with missing or invalid credentials.", + "description": "Authentication or permission failure. A missing key also returns `403`; a wrong, revoked or expired key returns `401`. Exception: when the `sessionId` does not resolve to a live session, the pre-auth owner lookup returns `404` first, even with missing or invalid credentials.", "content": { "application/json": { "schema": { @@ -4885,12 +5185,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.delete(\n \"https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/delete/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n json={\"retain_face_embeddings\": True, \"face_retention_days\": 365},\n)\nresponse.raise_for_status()\nprint(response.json()[\"face_retention_outcome\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.delete(\n \"11111111-2222-3333-4444-555555555555\",\n retain_face_embeddings=True,\n face_retention_days=365,\n instruction_id=\"post-approval-cleanup-2026-08\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch(\n 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/delete/',\n {\n method: 'DELETE',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ deletion_instruction: 'privacy_erasure', instruction_id: 'dsar-2026-0142' }),\n },\n);\nconst body = await resp.json();\nconsole.log(body.face_retention_outcome);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.delete(\"11111111-2222-3333-4444-555555555555\", {\n retain_face_embeddings: true,\n face_retention_days: 365,\n instruction_id: \"post-approval-cleanup-2026-08\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Delete(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsDeleteParams{\n\tRetainFaceEmbeddings: didit.Bool(true),\n\tFaceRetentionDays: didit.Int(365),\n\tInstructionID: didit.String(\"post-approval-cleanup-2026-08\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsDeleteParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().delete(\"11111111-2222-3333-4444-555555555555\", SessionsDeleteParams.builder()\n .retainFaceEmbeddings(true)\n .faceRetentionDays(365L)\n .instructionId(\"post-approval-cleanup-2026-08\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->delete('11111111-2222-3333-4444-555555555555', [\n 'retain_face_embeddings' => true,\n 'face_retention_days' => 365,\n 'instruction_id' => 'post-approval-cleanup-2026-08',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.delete(\n \"11111111-2222-3333-4444-555555555555\",\n retain_face_embeddings: true,\n face_retention_days: 365,\n instruction_id: \"post-approval-cleanup-2026-08\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.DeleteAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsDeleteParams\n{\n RetainFaceEmbeddings = true,\n FaceRetentionDays = 365,\n InstructionId = \"post-approval-cleanup-2026-08\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -5022,7 +5347,7 @@ } }, "403": { - "description": "Authentication, authorization, or session-status failure. **This endpoint never returns `401`** — Didit's API-key authentication does not emit a `WWW-Authenticate` challenge, so missing or invalid credentials also surface as `403`. Distinguish the failure modes by the `detail` string:\n\n- `\"Authentication credentials were not provided or are invalid.\"` — no `x-api-key` header (and no `Authorization: Bearer` token), or the supplied credential failed introspection (revoked, expired, or malformed).\n- `\"You do not have permission to perform this action.\"` — the credential is valid but cannot read this session: a console-user Bearer token lacks the `read:sessions` permission or cannot access the owning application, or an API key belongs to a different organization than the session.\n- `\"You can only generate a PDF for sessions in review, declined, approved or kyc expired\"` — the KYC session exists but is not in an eligible status yet (for example `Not Started` or `In Progress`). Wait for the `status.updated` webhook before requesting the report.\n- `\"You can only generate a PDF for sessions in review, declined or approved\"` — same condition for KYB sessions.\n\nNote that for a completely unknown `sessionId` the endpoint resolves the owning application before validating credentials, so a missing session returns `404` even when the credential is missing or invalid.", + "description": "Authentication, authorization, or session-status failure. A missing key returns `403`; a wrong, revoked or expired key returns `401`. Distinguish the failure modes by the `detail` string:\n\n- `\"Authentication credentials were not provided or are invalid.\"` — no `x-api-key` header (and no `Authorization: Bearer` token), or the supplied credential failed introspection (revoked, expired, or malformed).\n- `\"You do not have permission to perform this action.\"` — the credential is valid but cannot read this session: a console-user Bearer token lacks the `read:sessions` permission or cannot access the owning application, or an API key belongs to a different organization than the session.\n- `\"You can only generate a PDF for sessions in review, declined, approved or kyc expired\"` — the KYC session exists but is not in an eligible status yet (for example `Not Started` or `In Progress`). Wait for the `status.updated` webhook before requesting the report.\n- `\"You can only generate a PDF for sessions in review, declined or approved\"` — same condition for KYB sessions.\n\nNote that for a completely unknown `sessionId` the endpoint resolves the owning application before validating credentials, so a missing session returns `404` even when the credential is missing or invalid.", "content": { "application/json": { "schema": { @@ -5164,12 +5489,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.get(\n \"https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/generate-pdf/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n stream=True,\n timeout=60,\n)\nresponse.raise_for_status()\nwith open(\"report.pdf\", \"wb\") as fh:\n for chunk in response.iter_content(chunk_size=8192):\n fh.write(chunk)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.generate_pdf(\n \"11111111-2222-3333-4444-555555555555\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n file.write(content)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import { writeFile } from 'node:fs/promises';\n\nconst response = await fetch(\n 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/generate-pdf/',\n { headers: { 'x-api-key': 'YOUR_API_KEY' } },\n);\nif (!response.ok) throw new Error(`PDF generation failed: HTTP ${response.status}`);\nawait writeFile('report.pdf', Buffer.from(await response.arrayBuffer()));" + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.generatePdf(\"11111111-2222-3333-4444-555555555555\");\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.GeneratePDF(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().generatePdf(\"11111111-2222-3333-4444-555555555555\")\n .writeTo(Path.of(\"download.pdf\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->generatePdf('11111111-2222-3333-4444-555555555555');\n$content->saveTo('download.pdf');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.generate_pdf(\"11111111-2222-3333-4444-555555555555\")\nFile.binwrite(\"download.pdf\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.GeneratePdfAsync(\"11111111-2222-3333-4444-555555555555\");\nawait content.SaveToAsync(\"download.pdf\");" } ] } @@ -5426,7 +5776,8 @@ "EMAIL", "KYB_REGISTRY", "KYB_KEY_PEOPLE", - "KYB" + "KYB", + "GEOLOCATION" ], "example": "OCR" } @@ -5641,7 +5992,7 @@ } }, "403": { - "description": "Missing/invalid credentials or insufficient permissions, or a `session_id` that belongs to another application.", + "description": "Missing credentials or insufficient permissions, or a `session_id` that belongs to another application.", "content": { "application/json": { "examples": { @@ -5715,12 +6066,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.patch(\n \"https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-status/\",\n headers={\n \"x-api-key\": \"YOUR_API_KEY\",\n \"Content-Type\": \"application/json\",\n },\n json={\n \"new_status\": \"Resubmitted\",\n \"nodes_to_resubmit\": [\n {\"node_id\": \"feature_ocr\", \"feature\": \"OCR\"},\n {\"node_id\": \"feature_liveness\", \"feature\": \"LIVENESS\"},\n ],\n \"send_email\": True,\n \"email_address\": \"user@example.com\",\n \"email_language\": \"en\",\n },\n)\nresponse.raise_for_status()\nprint(response.json()) # {'session_id': '11111111-2222-3333-4444-555555555555'}" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_status(\n \"11111111-2222-3333-4444-555555555555\",\n new_status=\"Approved\",\n comment=\"All checks passed manual review\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const response = await fetch(\n 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-status/',\n {\n method: 'PATCH',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n new_status: 'Declined',\n comment: 'Suspected fraud',\n }),\n },\n);\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { session_id } = await response.json();" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateStatus(\"11111111-2222-3333-4444-555555555555\", {\n new_status: \"Approved\",\n comment: \"All checks passed manual review\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateStatus(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdateStatusParams{\n\tNewStatus: \"Approved\",\n\tComment: didit.String(\"All checks passed manual review\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateStatus(\"11111111-2222-3333-4444-555555555555\", SessionsUpdateStatusParams.builder()\n .newStatus(SessionsUpdateStatusParams.NewStatus.of(\"Approved\"))\n .comment(\"All checks passed manual review\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->updateStatus('11111111-2222-3333-4444-555555555555', [\n 'new_status' => 'Approved',\n 'comment' => 'All checks passed manual review',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_status(\n \"11111111-2222-3333-4444-555555555555\",\n new_status: \"Approved\",\n comment: \"All checks passed manual review\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateStatusAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsUpdateStatusParams\n{\n NewStatus = \"Approved\",\n Comment = \"All checks passed manual review\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -5728,7 +6104,7 @@ "/v3/id-verification/": { "post": { "summary": "ID Verification (document OCR + fraud checks)", - "description": "OCR an identity document and run document fraud checks in one call — returns the extracted holder fields, the parsed MRZ, an `Approved`/`Declined`/`In Review` `status`, and a `warnings` list explaining every issue found. Supports 14,000+ document types from 220+ countries and territories.\n\n**How it works.** Send the document's `front_image` (required) and, for two-sided documents, the `back_image`. Upload uncropped photos with all four corners of the document visible — the service detects, aligns, and crops the document itself, so do not pre-crop. The document is classified automatically (you never declare the country or document type), the visual zone is read with OCR, and the MRZ and any barcodes are decoded. Cross-checks then validate dates, number formats, and MRZ check digits, and compare the visual zone against the MRZ. With `perform_document_liveness=true`, the images are additionally screened for screen replays, printed copies, and portrait manipulation.\n\n**Decision logic.** `status` is `Approved` unless at least one warning resolves to a decline. Fraud and hard-failure risks always decline: `DOCUMENT_EXPIRED`, `SCREEN_CAPTURE_DETECTED`, `PRINTED_COPY_DETECTED`, `PORTRAIT_MANIPULATION_DETECTED`, `PUBLIC_DOCUMENT_IMAGE_DETECTED`, plus extraction failures (`NAME_NOT_DETECTED`, `DATE_OF_BIRTH_NOT_DETECTED`, `DOCUMENT_NUMBER_NOT_DETECTED`). (`PORTRAIT_IMAGE_NOT_DETECTED`, `COULD_NOT_DETECT_DOCUMENT_TYPE`, `INVALID_DATE`, and `MRZ_NOT_DETECTED` exist in workflow sessions but are never produced by this standalone endpoint.) Three risk groups are configurable per request via `invalid_mrz_action`, `inconsistent_data_action`, and `expiration_date_not_detected_action` (`DECLINE` or `NO_ACTION`). All other warnings (e.g. `POSSIBLE_DUPLICATED_USER`) are informational and never decline on their own. When `perform_document_liveness=true` (the default) and the forgery check returns no usable score — the provider failed, answered non-200, or answered HTTP 200 with `status=\"ERR\"` - the call returns `200` with `status: \"In Review\"` and a `DOCUMENT_LIVENESS_NOT_COMPUTED` warning (`log_type: \"warning\"`) instead of `Approved`: a check that did not run is not evidence that the document is genuine. This escalation is not configurable and never overrides a `Declined`; with `perform_document_liveness=false` the check is skipped and the status follows the remaining warnings as before. A document that cannot be processed at all returns `400` with `{\"error\": \"COULD_NOT_RECOGNIZE_DOCUMENT\"}`; a readable but problematic document returns `200` with `status: \"Declined\"` — always inspect `id_verification.status` and `id_verification.warnings`, not just the HTTP code.\n\n**Billing.** Each `200` response consumes one ID Verification API credit (paid from your plan credit or top-up balance). When the organization's balance cannot cover the call, the endpoint returns `403` with the not-enough-credits error before any image processing.\n\n**Session persistence (`save_api_request`, default `true`).** When `true`, the call is persisted as an API-type session: it appears in the Business Console, the returned `request_id` is a real session id you can pass to `GET /v3/session/{sessionId}/decision/`, the cropped document/portrait images are stored and returned as short-lived media URLs (`https:///ocr/...`), and a `status.updated` webhook is emitted to your configured webhook endpoints. When `false`, nothing is stored, `request_id` is a one-off correlation UUID, and `portrait_image`/`front_image`/`back_image` are returned inline as base64-encoded JPEG strings.\n\n**Sandbox.** Sandbox API keys skip all processing and billing: after request validation (malformed input still returns `400`), the endpoint returns a static `Approved` mock payload (a fictional \"Sandbox User\" USA identity card), no session is persisted, and no credits are consumed.\n\n**Authentication.** Send your application's API key in the `x-api-key` header. Missing or invalid credentials return `403` (`{\"detail\": \"You do not have permission to perform this action.\"}`) — this API never returns `401`.\n\n**Rate limit.** Shared write budget of 300 requests/min per API key across all POST/PATCH/DELETE endpoints; exceeding it returns `429`.", + "description": "OCR an identity document and run document fraud checks in one call — returns the extracted holder fields, the parsed MRZ, an `Approved`/`Declined`/`In Review` `status`, and a `warnings` list explaining every issue found. Supports 14,000+ document types from 220+ countries and territories.\n\n**How it works.** Send the document's `front_image` (required) and, for two-sided documents, the `back_image`. Upload uncropped photos with all four corners of the document visible — the service detects, aligns, and crops the document itself, so do not pre-crop. The document is classified automatically (you never declare the country or document type), the visual zone is read with OCR, and the MRZ and any barcodes are decoded. Cross-checks then validate dates, number formats, and MRZ check digits, and compare the visual zone against the MRZ. With `perform_document_liveness=true`, the images are additionally screened for screen replays, printed copies, and portrait manipulation.\n\n**Decision logic.** `status` is `Approved` unless at least one warning resolves to a decline. Fraud and hard-failure risks always decline: `DOCUMENT_EXPIRED`, `SCREEN_CAPTURE_DETECTED`, `PRINTED_COPY_DETECTED`, `PORTRAIT_MANIPULATION_DETECTED`, `PUBLIC_DOCUMENT_IMAGE_DETECTED`, plus extraction failures (`NAME_NOT_DETECTED`, `DATE_OF_BIRTH_NOT_DETECTED`, `DOCUMENT_NUMBER_NOT_DETECTED`). (`PORTRAIT_IMAGE_NOT_DETECTED`, `INVALID_DATE`, and `MRZ_NOT_DETECTED` exist in workflow sessions but are never produced by this standalone endpoint. `COULD_NOT_DETECT_DOCUMENT_TYPE` is returned here when the front image does not match a known official document design with high confidence, and declines the request.) Three risk groups are configurable per request via `invalid_mrz_action`, `inconsistent_data_action`, and `expiration_date_not_detected_action` (`DECLINE` or `NO_ACTION`). All other warnings (e.g. `POSSIBLE_DUPLICATED_USER`) are informational and never decline on their own. When `perform_document_liveness=true` (the default) and the forgery check returns no usable score — the provider failed, answered non-200, or answered HTTP 200 with `status=\"ERR\"` - the call returns `200` with `status: \"In Review\"` and a `DOCUMENT_LIVENESS_NOT_COMPUTED` warning (`log_type: \"warning\"`) instead of `Approved`: a check that did not run is not evidence that the document is genuine. This escalation is not configurable and never overrides a `Declined`; with `perform_document_liveness=false` the check is skipped and the status follows the remaining warnings as before. A document that cannot be processed at all returns `400` with `{\"error\": \"COULD_NOT_RECOGNIZE_DOCUMENT\"}`; a readable but problematic document returns `200` with `status: \"Declined\"` — always inspect `id_verification.status` and `id_verification.warnings`, not just the HTTP code.\n\n**Billing.** Each `200` response consumes one ID Verification API credit (paid from your plan credit or top-up balance). When the organization's balance cannot cover the call, the endpoint returns `403` with the not-enough-credits error before any image processing.\n\n**Session persistence (`save_api_request`, default `true`).** When `true`, the call is persisted as an API-type session: it appears in the Business Console, the returned `request_id` is a real session id you can pass to `GET /v3/session/{sessionId}/decision/`, the cropped document/portrait images are stored and returned as short-lived media URLs (`https:///ocr/...`), and a `status.updated` webhook is emitted to your configured webhook endpoints. When `false`, nothing is stored, `request_id` is a one-off correlation UUID, and `portrait_image`/`front_image`/`back_image` are returned inline as base64-encoded JPEG strings.\n\n**Sandbox.** Sandbox API keys skip all processing and billing: after request validation (malformed input still returns `400`), the endpoint returns a static `Approved` mock payload (a fictional \"Sandbox User\" USA identity card), no session is persisted, and no credits are consumed.\n\n**Authentication.** Send your application's API key in the `x-api-key` header. Missing or invalid credentials return `403` (`{\"detail\": \"You do not have permission to perform this action.\"}`) — this API never returns `401`.\n\n**Rate limit.** Shared write budget of 300 requests/min per API key across all POST/PATCH/DELETE endpoints; exceeding it returns `429`.", "operationId": "post_v3id-verification", "x-didit-sdk": { "resource": "id_verification", @@ -6546,7 +6922,7 @@ "properties": { "risk": { "type": "string", - "description": "Machine-readable risk code. Always-decline risks: `DOCUMENT_EXPIRED`, `MINIMUM_AGE_NOT_MET`, `PORTRAIT_IMAGE_NOT_DETECTED`, `SCREEN_CAPTURE_DETECTED`, `PRINTED_COPY_DETECTED`, `PORTRAIT_MANIPULATION_DETECTED`, `PUBLIC_DOCUMENT_IMAGE_DETECTED`, `INVALID_DATE`, `COULD_NOT_RECOGNIZE_DOCUMENT` (400-only, never a warning), `DOCUMENT_NUMBER_NOT_DETECTED`, `COULD_NOT_DETECT_DOCUMENT_TYPE`, `NAME_NOT_DETECTED`, `DATE_OF_BIRTH_NOT_DETECTED`. Governed by request options: `MRZ_NOT_DETECTED` / `MRZ_VALIDATION_FAILED` (`invalid_mrz_action`), `DATA_INCONSISTENT` / `MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` / `DOCUMENT_NAME_DIFFERENT_FROM_OTHER_APPROVED_DOCUMENTS` (`inconsistent_data_action`), `EXPIRATION_DATE_NOT_DETECTED` (`expiration_date_not_detected_action`). Other risks (e.g. `POSSIBLE_DUPLICATED_USER`) are informational. `DOCUMENT_LIVENESS_NOT_COMPUTED` is raised when `perform_document_liveness=true` but the forgery check returned no usable score; it sets `status` to `In Review`.", + "description": "Machine-readable risk code. Always-decline risks: `DOCUMENT_EXPIRED`, `MINIMUM_AGE_NOT_MET`, `PORTRAIT_IMAGE_NOT_DETECTED`, `SCREEN_CAPTURE_DETECTED`, `PRINTED_COPY_DETECTED`, `PORTRAIT_MANIPULATION_DETECTED`, `PUBLIC_DOCUMENT_IMAGE_DETECTED`, `INVALID_DATE`, `COULD_NOT_RECOGNIZE_DOCUMENT` (400-only, never a warning), `DOCUMENT_NUMBER_NOT_DETECTED`, `COULD_NOT_DETECT_DOCUMENT_TYPE`, `NAME_NOT_DETECTED`, `DATE_OF_BIRTH_NOT_DETECTED`. Governed by request options: `MRZ_NOT_DETECTED` / `MRZ_VALIDATION_FAILED` (`invalid_mrz_action`), `DATA_INCONSISTENT` / `MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` / `DOCUMENT_NAME_DIFFERENT_FROM_OTHER_APPROVED_DOCUMENTS` (`inconsistent_data_action`), `EXPIRATION_DATE_NOT_DETECTED` (`expiration_date_not_detected_action`). Other risks (e.g. `POSSIBLE_DUPLICATED_USER`) are informational. `DOCUMENT_LIVENESS_NOT_COMPUTED` is raised when `perform_document_liveness=true` but the forgery check returned no usable score; it sets `status` to `In Review`. `COULD_NOT_DETECT_DOCUMENT_TYPE` is also returned when the front of the document does not match a known official document design with high confidence, for example an edited or computer-generated document, or a design that is not supported yet.", "example": "DOCUMENT_EXPIRED" }, "feature": { @@ -6703,7 +7079,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any image processing happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any image processing happens.", "content": { "application/json": { "examples": { @@ -6761,12 +7137,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nurl = 'https://verification.didit.me/v3/id-verification/'\nheaders = {'x-api-key': 'YOUR_API_KEY'}\n\nwith open('id_front.jpg', 'rb') as front_f, open('id_back.jpg', 'rb') as back_f:\n files = {\n 'front_image': ('id_front.jpg', front_f, 'image/jpeg'),\n 'back_image': ('id_back.jpg', back_f, 'image/jpeg'),\n }\n data = {\n 'perform_document_liveness': 'true',\n 'save_api_request': 'true',\n 'vendor_data': 'user-123',\n }\n resp = requests.post(url, headers=headers, files=files, data=data, timeout=120)\n\nresp.raise_for_status()\nid_v = resp.json()['id_verification']\nprint('status:', id_v['status'])\nprint('name:', id_v.get('full_name'))\nprint('document:', id_v.get('document_type'), id_v.get('document_number'))\nfor w in id_v.get('warnings', []):\n print('warning:', w['risk'], '-', w['log_type'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_verification.verify(\n front_image=open(\"front_image.jpg\", \"rb\"),\n back_image=open(\"back_image.jpg\", \"rb\"),\n perform_document_liveness=True,\n save_api_request=True,\n vendor_data=\"user-123\",\n metadata={\"flow\": \"onboarding\"},\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import fs from 'node:fs';\n\nconst form = new FormData();\nform.append('front_image', new Blob([fs.readFileSync('./id_front.jpg')]), 'id_front.jpg');\nform.append('back_image', new Blob([fs.readFileSync('./id_back.jpg')]), 'id_back.jpg');\nform.append('perform_document_liveness', 'true');\nform.append('save_api_request', 'true');\nform.append('vendor_data', 'user-123');\n\nconst response = await fetch('https://verification.didit.me/v3/id-verification/', {\n method: 'POST',\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n body: form,\n});\n\nif (!response.ok) throw new Error(`ID verification failed: ${response.status}`);\nconst body = await response.json();\nconsole.log('status:', body.id_verification.status);\nconsole.log('warnings:', body.id_verification.warnings.map((w) => w.risk));" + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idVerification.verify({\n front_image: await fileFromPath(\"front_image.jpg\"),\n back_image: await fileFromPath(\"back_image.jpg\"),\n perform_document_liveness: true,\n save_api_request: true,\n vendor_data: \"user-123\",\n metadata: { flow: \"onboarding\" },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDVerification.Verify(ctx, didit.IDVerificationVerifyParams{\n\tFrontImage: didit.FileFromPath(\"front_image.jpg\"),\n\tBackImage: didit.Some(didit.FileFromPath(\"back_image.jpg\")),\n\tPerformDocumentLiveness: didit.Bool(true),\n\tSaveAPIRequest: didit.Bool(true),\n\tVendorData: didit.String(\"user-123\"),\n\tMetadata: didit.Some(map[string]any{\"flow\": \"onboarding\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.IdVerificationVerifyParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idVerification().verify(IdVerificationVerifyParams.builder()\n .frontImage(Path.of(\"front_image.jpg\"))\n .backImage(Path.of(\"back_image.jpg\"))\n .performDocumentLiveness(true)\n .saveApiRequest(true)\n .vendorData(\"user-123\")\n .metadata(Map.of(\"flow\", \"onboarding\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idVerification->verify([\n 'front_image' => File::fromPath('front_image.jpg'),\n 'back_image' => File::fromPath('back_image.jpg'),\n 'perform_document_liveness' => true,\n 'save_api_request' => true,\n 'vendor_data' => 'user-123',\n 'metadata' => ['flow' => 'onboarding'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_verification.verify(\n front_image: Pathname(\"front_image.jpg\"),\n back_image: Pathname(\"back_image.jpg\"),\n perform_document_liveness: true,\n save_api_request: true,\n vendor_data: \"user-123\",\n metadata: { flow: \"onboarding\" }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdVerification.VerifyAsync(new IdVerificationVerifyParams\n{\n FrontImage = FileUpload.FromPath(\"front_image.jpg\"),\n BackImage = FileUpload.FromPath(\"back_image.jpg\"),\n PerformDocumentLiveness = true,\n SaveApiRequest = true,\n VendorData = \"user-123\",\n Metadata = new Dictionary { [\"flow\"] = \"onboarding\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -7231,7 +7632,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any image processing happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any image processing happens.", "content": { "application/json": { "examples": { @@ -7289,12 +7690,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nurl = 'https://verification.didit.me/v3/face-match/'\nheaders = {'x-api-key': 'YOUR_API_KEY'}\n\nwith open('selfie.jpg', 'rb') as user_f, open('id_portrait.jpg', 'rb') as ref_f:\n files = {\n 'user_image': ('selfie.jpg', user_f, 'image/jpeg'),\n 'ref_image': ('id_portrait.jpg', ref_f, 'image/jpeg'),\n }\n data = {\n 'face_match_score_decline_threshold': 50,\n 'save_api_request': 'true',\n 'vendor_data': 'user-123',\n }\n resp = requests.post(url, headers=headers, files=files, data=data, timeout=60)\n\nresp.raise_for_status()\nbody = resp.json()\nprint('status:', body['face_match']['status'])\nprint('score:', body['face_match']['score'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.face_match.compare(\n user_image=open(\"user_image.jpg\", \"rb\"),\n ref_image=open(\"ref_image.jpg\", \"rb\"),\n face_match_score_decline_threshold=50.0,\n rotate_image=False,\n save_api_request=True,\n vendor_data=\"user-123\",\n metadata={\"flow\": \"login\"},\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import fs from 'node:fs';\n\nconst form = new FormData();\nform.append('user_image', new Blob([fs.readFileSync('./selfie.jpg')]), 'selfie.jpg');\nform.append('ref_image', new Blob([fs.readFileSync('./id_portrait.jpg')]), 'id_portrait.jpg');\nform.append('face_match_score_decline_threshold', '50');\nform.append('save_api_request', 'true');\nform.append('vendor_data', 'user-123');\n\nconst response = await fetch('https://verification.didit.me/v3/face-match/', {\n method: 'POST',\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n body: form,\n});\n\nif (!response.ok) throw new Error(`Face match failed: ${response.status}`);\nconst body = await response.json();\nconsole.log('status:', body.face_match.status, 'score:', body.face_match.score);" + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.faceMatch.compare({\n user_image: await fileFromPath(\"user_image.jpg\"),\n ref_image: await fileFromPath(\"ref_image.jpg\"),\n face_match_score_decline_threshold: 50.0,\n rotate_image: false,\n save_api_request: true,\n vendor_data: \"user-123\",\n metadata: { flow: \"login\" },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FaceMatch.Compare(ctx, didit.FaceMatchCompareParams{\n\tUserImage: didit.FileFromPath(\"user_image.jpg\"),\n\tRefImage: didit.FileFromPath(\"ref_image.jpg\"),\n\tFaceMatchScoreDeclineThreshold: didit.Float(50.0),\n\tRotateImage: didit.Bool(false),\n\tSaveAPIRequest: didit.Bool(true),\n\tVendorData: didit.String(\"user-123\"),\n\tMetadata: didit.Some(map[string]any{\"flow\": \"login\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.FaceMatchCompareParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.faceMatch().compare(FaceMatchCompareParams.builder()\n .userImage(Path.of(\"user_image.jpg\"))\n .refImage(Path.of(\"ref_image.jpg\"))\n .faceMatchScoreDeclineThreshold(50.0)\n .rotateImage(false)\n .saveApiRequest(true)\n .vendorData(\"user-123\")\n .metadata(Map.of(\"flow\", \"login\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "faceMatch->compare([\n 'user_image' => File::fromPath('user_image.jpg'),\n 'ref_image' => File::fromPath('ref_image.jpg'),\n 'face_match_score_decline_threshold' => 50.0,\n 'rotate_image' => false,\n 'save_api_request' => true,\n 'vendor_data' => 'user-123',\n 'metadata' => ['flow' => 'login'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.face_match.compare(\n user_image: Pathname(\"user_image.jpg\"),\n ref_image: Pathname(\"ref_image.jpg\"),\n face_match_score_decline_threshold: 50.0,\n rotate_image: false,\n save_api_request: true,\n vendor_data: \"user-123\",\n metadata: { flow: \"login\" }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.FaceMatch.CompareAsync(new FaceMatchCompareParams\n{\n UserImage = FileUpload.FromPath(\"user_image.jpg\"),\n RefImage = FileUpload.FromPath(\"ref_image.jpg\"),\n FaceMatchScoreDeclineThreshold = 50.0,\n RotateImage = false,\n SaveApiRequest = true,\n VendorData = \"user-123\",\n Metadata = new Dictionary { [\"flow\"] = \"login\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -7720,7 +8146,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any image processing happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any image processing happens.", "content": { "application/json": { "examples": { @@ -7778,12 +8204,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nurl = 'https://verification.didit.me/v3/age-estimation/'\nheaders = {'x-api-key': 'YOUR_API_KEY'}\n\nwith open('selfie.jpg', 'rb') as f:\n files = {'user_image': ('selfie.jpg', f, 'image/jpeg')}\n data = {\n 'age_estimation_decline_threshold': 18,\n 'face_liveness_score_decline_threshold': 30,\n 'save_api_request': 'true',\n 'vendor_data': 'user-123',\n }\n resp = requests.post(url, headers=headers, files=files, data=data, timeout=60)\n\nresp.raise_for_status()\nresult = resp.json()['age_estimation']\nprint('status:', result['status'])\nprint('estimated age:', result['age_estimation'])\nprint('liveness score:', result['score'])\nfor w in result['warnings']:\n print('warning:', w['risk'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.age_estimation.estimate(\n user_image=open(\"user_image.jpg\", \"rb\"),\n face_liveness_score_decline_threshold=30.0,\n age_estimation_decline_threshold=18,\n rotate_image=False,\n save_api_request=True,\n vendor_data=\"user-123\",\n metadata={\"flow\": \"age-gate\"},\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import fs from 'node:fs';\n\nconst form = new FormData();\nform.append('user_image', new Blob([fs.readFileSync('./selfie.jpg')]), 'selfie.jpg');\nform.append('age_estimation_decline_threshold', '18');\nform.append('face_liveness_score_decline_threshold', '30');\nform.append('save_api_request', 'true');\nform.append('vendor_data', 'user-123');\n\nconst response = await fetch('https://verification.didit.me/v3/age-estimation/', {\n method: 'POST',\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n body: form,\n});\n\nif (!response.ok) throw new Error(`Age estimation failed: ${response.status}`);\nconst { age_estimation } = await response.json();\nconsole.log('status:', age_estimation.status, 'age:', age_estimation.age_estimation, 'liveness:', age_estimation.score);" + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.ageEstimation.estimate({\n user_image: await fileFromPath(\"user_image.jpg\"),\n face_liveness_score_decline_threshold: 30.0,\n age_estimation_decline_threshold: 18,\n rotate_image: false,\n save_api_request: true,\n vendor_data: \"user-123\",\n metadata: { flow: \"age-gate\" },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AgeEstimation.Estimate(ctx, didit.AgeEstimationEstimateParams{\n\tUserImage: didit.FileFromPath(\"user_image.jpg\"),\n\tFaceLivenessScoreDeclineThreshold: didit.Float(30.0),\n\tAgeEstimationDeclineThreshold: didit.Int(18),\n\tRotateImage: didit.Bool(false),\n\tSaveAPIRequest: didit.Bool(true),\n\tVendorData: didit.String(\"user-123\"),\n\tMetadata: didit.Some(map[string]any{\"flow\": \"age-gate\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.AgeEstimationEstimateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.ageEstimation().estimate(AgeEstimationEstimateParams.builder()\n .userImage(Path.of(\"user_image.jpg\"))\n .faceLivenessScoreDeclineThreshold(30.0)\n .ageEstimationDeclineThreshold(18L)\n .rotateImage(false)\n .saveApiRequest(true)\n .vendorData(\"user-123\")\n .metadata(Map.of(\"flow\", \"age-gate\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "ageEstimation->estimate([\n 'user_image' => File::fromPath('user_image.jpg'),\n 'face_liveness_score_decline_threshold' => 30.0,\n 'age_estimation_decline_threshold' => 18,\n 'rotate_image' => false,\n 'save_api_request' => true,\n 'vendor_data' => 'user-123',\n 'metadata' => ['flow' => 'age-gate'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.age_estimation.estimate(\n user_image: Pathname(\"user_image.jpg\"),\n face_liveness_score_decline_threshold: 30.0,\n age_estimation_decline_threshold: 18,\n rotate_image: false,\n save_api_request: true,\n vendor_data: \"user-123\",\n metadata: { flow: \"age-gate\" }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.AgeEstimation.EstimateAsync(new AgeEstimationEstimateParams\n{\n UserImage = FileUpload.FromPath(\"user_image.jpg\"),\n FaceLivenessScoreDeclineThreshold = 30.0,\n AgeEstimationDeclineThreshold = 18,\n RotateImage = false,\n SaveApiRequest = true,\n VendorData = \"user-123\",\n Metadata = new Dictionary { [\"flow\"] = \"age-gate\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -8525,7 +8976,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any document processing happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any document processing happens.", "content": { "application/json": { "examples": { @@ -8583,12 +9034,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nurl = 'https://verification.didit.me/v3/poa/'\nheaders = {'x-api-key': 'YOUR_API_KEY'}\n\nwith open('utility-bill.pdf', 'rb') as f:\n files = {'document': ('utility-bill.pdf', f, 'application/pdf')}\n data = {\n 'expected_address': 'Av. Monseñor Tavella 1291, Salta, Argentina',\n 'expected_country': 'ARG',\n 'expected_first_name': 'Sophia',\n 'expected_last_name': 'Martinez',\n 'poa_languages_allowed': 'en,es',\n 'vendor_data': 'user-123',\n }\n # LLM-based extraction takes 5-15s (multi-page PDFs up to ~30s) - allow headroom\n resp = requests.post(url, headers=headers, files=files, data=data, timeout=45)\n\nresp.raise_for_status()\npoa = resp.json()['poa']\nprint('status:', poa['status'])\nprint('issuer:', poa['issuer'], '| issued:', poa['issue_date'])\nprint('address:', poa['poa_formatted_address'])\nfor w in poa['warnings']:\n print('warning:', w['risk'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.proof_of_address.verify(\n document=open(\"document.pdf\", \"rb\"),\n expected_address=\"Av. Monseñor Tavella 1291, Salta, Argentina\",\n expected_country=\"ARG\",\n expected_first_name=\"Sophia\",\n expected_last_name=\"Martinez\",\n poa_languages_allowed=\"en,es\",\n save_api_request=True,\n vendor_data=\"user-123\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import fs from 'node:fs';\n\nconst form = new FormData();\nform.append('document', new Blob([fs.readFileSync('./utility-bill.pdf')]), 'utility-bill.pdf');\nform.append('expected_address', 'Av. Monseñor Tavella 1291, Salta, Argentina');\nform.append('expected_country', 'ARG');\nform.append('expected_first_name', 'Sophia');\nform.append('expected_last_name', 'Martinez');\nform.append('poa_languages_allowed', 'en,es');\nform.append('vendor_data', 'user-123');\n\n// LLM-based extraction takes 5-15s (multi-page PDFs up to ~30s) - allow >=45s\nconst response = await fetch('https://verification.didit.me/v3/poa/', {\n method: 'POST',\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n body: form,\n signal: AbortSignal.timeout(45_000),\n});\n\nif (!response.ok) throw new Error(`POA verification failed: ${response.status}`);\nconst { poa } = await response.json();\nconsole.log('status:', poa.status);\nconsole.log('warnings:', poa.warnings.map((w) => w.risk));" + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.proofOfAddress.verify({\n document: await fileFromPath(\"document.pdf\"),\n expected_address: \"Av. Monseñor Tavella 1291, Salta, Argentina\",\n expected_country: \"ARG\",\n expected_first_name: \"Sophia\",\n expected_last_name: \"Martinez\",\n poa_languages_allowed: \"en,es\",\n save_api_request: true,\n vendor_data: \"user-123\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.ProofOfAddress.Verify(ctx, didit.ProofOfAddressVerifyParams{\n\tDocument: didit.FileFromPath(\"document.pdf\"),\n\tExpectedAddress: didit.String(\"Av. Monseñor Tavella 1291, Salta, Argentina\"),\n\tExpectedCountry: didit.String(\"ARG\"),\n\tExpectedFirstName: didit.String(\"Sophia\"),\n\tExpectedLastName: didit.String(\"Martinez\"),\n\tPOALanguagesAllowed: didit.String(\"en,es\"),\n\tSaveAPIRequest: didit.Bool(true),\n\tVendorData: didit.String(\"user-123\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.ProofOfAddressVerifyParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.proofOfAddress().verify(ProofOfAddressVerifyParams.builder()\n .document(Path.of(\"document.pdf\"))\n .expectedAddress(\"Av. Monseñor Tavella 1291, Salta, Argentina\")\n .expectedCountry(\"ARG\")\n .expectedFirstName(\"Sophia\")\n .expectedLastName(\"Martinez\")\n .poaLanguagesAllowed(\"en,es\")\n .saveApiRequest(true)\n .vendorData(\"user-123\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "proofOfAddress->verify([\n 'document' => File::fromPath('document.pdf'),\n 'expected_address' => 'Av. Monseñor Tavella 1291, Salta, Argentina',\n 'expected_country' => 'ARG',\n 'expected_first_name' => 'Sophia',\n 'expected_last_name' => 'Martinez',\n 'poa_languages_allowed' => 'en,es',\n 'save_api_request' => true,\n 'vendor_data' => 'user-123',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.proof_of_address.verify(\n document: Pathname(\"document.pdf\"),\n expected_address: \"Av. Monseñor Tavella 1291, Salta, Argentina\",\n expected_country: \"ARG\",\n expected_first_name: \"Sophia\",\n expected_last_name: \"Martinez\",\n poa_languages_allowed: \"en,es\",\n save_api_request: true,\n vendor_data: \"user-123\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.ProofOfAddress.VerifyAsync(new ProofOfAddressVerifyParams\n{\n Document = FileUpload.FromPath(\"document.pdf\"),\n ExpectedAddress = \"Av. Monseñor Tavella 1291, Salta, Argentina\",\n ExpectedCountry = \"ARG\",\n ExpectedFirstName = \"Sophia\",\n ExpectedLastName = \"Martinez\",\n PoaLanguagesAllowed = \"en,es\",\n SaveApiRequest = true,\n VendorData = \"user-123\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -9206,7 +9682,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls — and contract-billed organizations whose rate card has no Document AI API entry — return `403` with `{\"error\": ...}` before any document processing happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls — and contract-billed organizations whose rate card has no Document AI API entry — return `403` with `{\"error\": ...}` before any document processing happens.", "content": { "application/json": { "examples": { @@ -9266,7 +9742,44 @@ } } } - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.document_ai.analyze(\n document=open(\"document.pdf\", \"rb\"),\n fields=\"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.documentAi.analyze({\n document: await fileFromPath(\"document.pdf\"),\n fields: \"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.DocumentAi.Analyze(ctx, didit.DocumentAiAnalyzeParams{\n\tDocument: didit.FileFromPath(\"document.pdf\"),\n\tFields: \"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.DocumentAiAnalyzeParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.documentAi().analyze(DocumentAiAnalyzeParams.builder()\n .document(Path.of(\"document.pdf\"))\n .fields(\"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "documentAi->analyze([\n 'document' => File::fromPath('document.pdf'),\n 'fields' => '[{\"key\": \"employer_name\", \"name\": \"Employer name\", \"instruction\": \"The employer or company issuing the payslip.\", \"type\": \"text\", \"required\": true, \"is_full_name\": false}, {\"key\": \"employee_name\", \"name\": \"Employee name\", \"instruction\": \"The full name of the employee as printed on the payslip.\", \"type\": \"text\", \"required\": true, \"is_full_name\": true}, {\"key\": \"net_pay\", \"name\": \"Net pay\", \"instruction\": \"The net amount paid to the employee for the period.\", \"type\": \"number\", \"required\": true, \"is_full_name\": false}, {\"key\": \"pay_date\", \"name\": \"Pay date\", \"instruction\": \"The payment date shown on the payslip.\", \"type\": \"date\", \"required\": false, \"is_full_name\": false}]',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.document_ai.analyze(\n document: Pathname(\"document.pdf\"),\n fields: \"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.DocumentAi.AnalyzeAsync(new DocumentAiAnalyzeParams\n{\n Document = FileUpload.FromPath(\"document.pdf\"),\n Fields = \"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/aml/": { @@ -9412,6 +9925,14 @@ "example": "decline_aml_hit" } } + }, + "example": { + "full_name": "Antonio Ejemplo Modelo", + "entity_type": "person", + "date_of_birth": "1972-02-29", + "nationality": "ES", + "include_adverse_media": false, + "vendor_data": "user-1234" } } } @@ -9425,12 +9946,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/aml/\",\n headers={\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Content-Type\": \"application/json\",\n \"Idempotency-Key\": \"aml-user-1234-2026-08-20\",\n },\n json={\n \"full_name\": \"Antonio Ejemplo Modelo\",\n \"entity_type\": \"person\",\n \"date_of_birth\": \"1972-02-29\",\n \"nationality\": \"ES\",\n \"include_adverse_media\": False,\n \"vendor_data\": \"user-1234\",\n },\n timeout=60, # adverse media enrichment can add ~30s\n)\nresp.raise_for_status()\nprint(resp.json()[\"aml\"][\"status\"]) # Approved / In Review / Declined" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.aml.screen(\n full_name=\"Antonio Ejemplo Modelo\",\n entity_type=\"person\",\n date_of_birth=\"1972-02-29\",\n nationality=\"ES\",\n include_adverse_media=False,\n vendor_data=\"user-1234\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/aml/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n 'Idempotency-Key': 'aml-user-1234-2026-08-20',\n },\n body: JSON.stringify({\n full_name: 'Antonio Ejemplo Modelo',\n entity_type: 'person',\n date_of_birth: '1972-02-29',\n nationality: 'ES',\n include_adverse_media: false,\n vendor_data: 'user-1234',\n }),\n});\nconst data = await res.json();\nconsole.log(data.aml.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.aml.screen({\n full_name: \"Antonio Ejemplo Modelo\",\n entity_type: \"person\",\n date_of_birth: \"1972-02-29\",\n nationality: \"ES\",\n include_adverse_media: false,\n vendor_data: \"user-1234\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AML.Screen(ctx, didit.AMLScreenParams{\n\tFullName: \"Antonio Ejemplo Modelo\",\n\tEntityType: didit.Some(didit.AMLScreenParamsEntityType(\"person\")),\n\tDateOfBirth: didit.String(\"1972-02-29\"),\n\tNationality: didit.String(\"ES\"),\n\tIncludeAdverseMedia: didit.Bool(false),\n\tVendorData: didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.LocalDate;\nimport me.didit.Didit;\nimport me.didit.types.AmlScreenParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.aml().screen(AmlScreenParams.builder()\n .fullName(\"Antonio Ejemplo Modelo\")\n .entityType(AmlScreenParams.EntityType.of(\"person\"))\n .dateOfBirth(LocalDate.parse(\"1972-02-29\"))\n .nationality(\"ES\")\n .includeAdverseMedia(false)\n .vendorData(\"user-1234\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "aml->screen([\n 'full_name' => 'Antonio Ejemplo Modelo',\n 'entity_type' => 'person',\n 'date_of_birth' => '1972-02-29',\n 'nationality' => 'ES',\n 'include_adverse_media' => false,\n 'vendor_data' => 'user-1234',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.aml.screen(\n full_name: \"Antonio Ejemplo Modelo\",\n entity_type: \"person\",\n date_of_birth: \"1972-02-29\",\n nationality: \"ES\",\n include_adverse_media: false,\n vendor_data: \"user-1234\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Aml.ScreenAsync(new AmlScreenParams\n{\n FullName = \"Antonio Ejemplo Modelo\",\n EntityType = new AmlScreenParamsEntityType(\"person\"),\n DateOfBirth = \"1972-02-29\",\n Nationality = \"ES\",\n IncludeAdverseMedia = false,\n VendorData = \"user-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -9479,7 +10025,7 @@ "id": { "type": "string", "nullable": true, - "description": "Stable identifier of the matched entity in the screening datasets." + "description": "Didit's stable identifier for the hit: `hit_` followed by 24 hexadecimal characters. The same matched entity keeps the same `id` when the subject is screened again. Pass it as `hit_id` to the AML hit review endpoints." }, "url": { "type": "string", @@ -9519,9 +10065,24 @@ "type": "array", "nullable": true, "items": { - "type": "string" + "type": "string", + "enum": [ + "PEP", + "PEP Level 1", + "PEP Level 2", + "PEP Level 3", + "PEP Level 4", + "Sanctions", + "Adverse Media", + "Warnings and Regulatory Enforcement", + "Fitness and Probity", + "SIP", + "SIE", + "Insolvency", + "Other Lists" + ] }, - "description": "Datasets the entity appears in (e.g. `PEP`, `PEP Level 1`, sanctions list names)." + "description": "Risk categories the entity is listed under: `PEP` (with its level, `PEP Level 1` to `PEP Level 4`), `Sanctions`, `Adverse Media`, `Warnings and Regulatory Enforcement`, `Fitness and Probity`, `SIP`, `SIE` or `Insolvency`. `Other Lists` when the entity's source states none of these categories." }, "features": { "type": "object", @@ -9935,7 +10496,7 @@ "entity_type": "person", "hits": [ { - "id": "kDpfszrbkDdaxpMVZw3NLg", + "id": "hit_7c1e9a40b2d35f86e0a4c912", "url": "https://news.example.org/articles/sample", "match": false, "score": 0.93, @@ -10134,7 +10695,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any screening or provider call happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any screening or provider call happens.", "content": { "application/json": { "examples": { @@ -10714,7 +11275,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any image processing happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any image processing happens.", "content": { "application/json": { "examples": { @@ -10772,12 +11333,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nurl = 'https://verification.didit.me/v3/face-search/'\nheaders = {'x-api-key': 'YOUR_API_KEY'}\n\nwith open('selfie.jpg', 'rb') as f:\n files = {'user_image': ('selfie.jpg', f, 'image/jpeg')}\n data = {\n 'search_type': 'most_similar',\n 'save_api_request': 'true',\n 'vendor_data': 'user-123',\n }\n resp = requests.post(url, headers=headers, files=files, data=data, timeout=60)\n\nresp.raise_for_status()\nbody = resp.json()\nprint('status:', body['face_search']['status'])\nprint('matches:', body['face_search']['total_matches'])\nfor m in body['face_search']['matches']:\n print(f\" session={m['session_id']} similarity={m['similarity_percentage']} blocklisted={m['is_blocklisted']}\")" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.face_search.search(\n user_image=open(\"user_image.jpg\", \"rb\"),\n search_type=\"most_similar\",\n rotate_image=False,\n save_api_request=True,\n vendor_data=\"user-123\",\n metadata={\"flow\": \"dedup_check\"},\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import fs from 'node:fs';\n\nconst form = new FormData();\nform.append('user_image', new Blob([fs.readFileSync('./selfie.jpg')]), 'selfie.jpg');\nform.append('search_type', 'most_similar');\nform.append('save_api_request', 'true');\nform.append('vendor_data', 'user-123');\n\nconst response = await fetch('https://verification.didit.me/v3/face-search/', {\n method: 'POST',\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n body: form,\n});\n\nif (!response.ok) throw new Error(`Face search failed: ${response.status}`);\nconst body = await response.json();\nconsole.log('status:', body.face_search.status, 'matches:', body.face_search.total_matches);\nbody.face_search.matches.forEach(m =>\n console.log(` session=${m.session_id} similarity=${m.similarity_percentage} blocklisted=${m.is_blocklisted}`)\n);" + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.faceSearch.search({\n user_image: await fileFromPath(\"user_image.jpg\"),\n search_type: \"most_similar\",\n rotate_image: false,\n save_api_request: true,\n vendor_data: \"user-123\",\n metadata: { flow: \"dedup_check\" },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FaceSearch.Search(ctx, didit.FaceSearchSearchParams{\n\tUserImage: didit.FileFromPath(\"user_image.jpg\"),\n\tSearchType: didit.Some(didit.FaceSearchSearchParamsSearchType(\"most_similar\")),\n\tRotateImage: didit.Bool(false),\n\tSaveAPIRequest: didit.Bool(true),\n\tVendorData: didit.String(\"user-123\"),\n\tMetadata: didit.Some(map[string]any{\"flow\": \"dedup_check\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.FaceSearchSearchParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.faceSearch().search(FaceSearchSearchParams.builder()\n .userImage(Path.of(\"user_image.jpg\"))\n .searchType(FaceSearchSearchParams.SearchType.of(\"most_similar\"))\n .rotateImage(false)\n .saveApiRequest(true)\n .vendorData(\"user-123\")\n .metadata(Map.of(\"flow\", \"dedup_check\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "faceSearch->search([\n 'user_image' => File::fromPath('user_image.jpg'),\n 'search_type' => 'most_similar',\n 'rotate_image' => false,\n 'save_api_request' => true,\n 'vendor_data' => 'user-123',\n 'metadata' => ['flow' => 'dedup_check'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.face_search.search(\n user_image: Pathname(\"user_image.jpg\"),\n search_type: \"most_similar\",\n rotate_image: false,\n save_api_request: true,\n vendor_data: \"user-123\",\n metadata: { flow: \"dedup_check\" }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.FaceSearch.SearchAsync(new FaceSearchSearchParams\n{\n UserImage = FileUpload.FromPath(\"user_image.jpg\"),\n SearchType = new FaceSearchSearchParamsSearchType(\"most_similar\"),\n RotateImage = false,\n SaveApiRequest = true,\n VendorData = \"user-123\",\n Metadata = new Dictionary { [\"flow\"] = \"dedup_check\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -10821,7 +11407,8 @@ "schema": { "type": "integer", "default": 50, - "minimum": 1 + "minimum": 1, + "maximum": 1000000 }, "example": 20 }, @@ -10833,7 +11420,8 @@ "schema": { "type": "integer", "default": 0, - "minimum": 0 + "minimum": 0, + "maximum": 1000000 }, "example": 20 }, @@ -10899,6 +11487,35 @@ }, "example": "2026-06-30" }, + { + "name": "tags", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "Comma-separated tag ids (`tags` of your application). Returns the sessions that carry any of them. Ids that are not valid UUIDs are ignored, and when none is valid the list is empty." + }, + { + "name": "decided_from", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "ISO 8601 datetime. Returns the sessions whose status last changed at or after it. It filters on the time of the last status change, not on creation time." + }, + { + "name": "decided_to", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "ISO 8601 datetime. Returns the sessions whose status last changed before it. Combine with `decided_from` for a half-open window." + }, { "name": "country", "in": "query", @@ -11061,7 +11678,7 @@ "properties": { "count": { "type": "integer", - "description": "Number of sessions matching the filters. Exact for KYC rows; for KYB rows it is capped at 100 (use `next` to know whether more pages exist). For `session_kind=all` it is the sum of both kinds.", + "description": "Number of sessions matching the filters: exact up to 100 and capped at 100 beyond that, so do not use it as a total. Use `next` to know whether more pages exist. For `session_kind=all` it is the sum of both kinds, each capped at 100.", "example": 2 }, "next": { @@ -11312,7 +11929,7 @@ } }, "403": { - "description": "Missing, malformed, or revoked API key. This API never returns `401`; all authentication failures are `403`.\n\n**Deleted application:** for a few minutes after an application is deleted, a request made with one of its API keys can answer `{\"detail\": \"This application was deleted.\", \"code\": \"application_deleted\"}`. Do not retry: the application and its API keys no longer exist. After those few minutes, the key is refused like any other invalid key.", + "description": "Missing, malformed, or revoked API key. A missing key returns `403`; a wrong, revoked or expired key returns `401`.\n\n**Deleted application:** for a few minutes after an application is deleted, a request made with one of its API keys can answer `{\"detail\": \"This application was deleted.\", \"code\": \"application_deleted\"}`. Do not retry: the application and its API keys no longer exist. After those few minutes, the key is refused like any other invalid key.", "content": { "application/json": { "schema": { @@ -11365,12 +11982,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nurl = \"https://verification.didit.me/v3/sessions/\"\nheaders = {\"x-api-key\": \"YOUR_API_KEY\"}\nparams = {\n \"session_kind\": \"user\", # \"user\" (default) | \"business\" | \"all\"\n \"status\": \"Approved,In Review\", # comma-separated, OR within the list\n \"date_from\": \"2026-06-01\",\n \"limit\": 20,\n}\n\nwhile url:\n response = requests.get(url, headers=headers, params=params)\n response.raise_for_status()\n page = response.json()\n for session in page[\"results\"]:\n print(session[\"session_kind\"], session[\"session_id\"], session[\"status\"])\n url, params = page[\"next\"], None # \"next\" already carries the query string" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.sessions.list():\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const params = new URLSearchParams({\n session_kind: 'all',\n status: 'Approved,In Review',\n date_from: '2026-06-01',\n limit: '20',\n});\n\nconst response = await fetch(\n `https://verification.didit.me/v3/sessions/?${params}`,\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n);\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\n\nconst { count, next, results } = await response.json();\nfor (const session of results) {\n // session.session_kind is \"user\" (KYC) or \"business\" (KYB)\n console.log(session.session_kind, session.session_id, session.status);\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.sessions.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.ListAutoPaging(ctx, didit.SessionsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.sessions().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->list() as $item) {\n print_r($item);\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Sessions.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ] } @@ -11586,12 +12228,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/share/\",\n headers={\n 'x-api-key': 'YOUR_API_KEY',\n \"Content-Type\": \"application/json\",\n },\n json={\n \"for_application_id\": \"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n \"ttl_in_seconds\": 7200,\n },\n)\nresponse.raise_for_status()\nshare_token = response.json()[\"share_token\"]" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.share(\n \"11111111-2222-3333-4444-555555555555\",\n for_application_id=\"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n ttl_in_seconds=7200,\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const response = await fetch(\n 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/share/',\n {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n for_application_id: 'a5f3bca2-46e2-411e-90ef-a580900a57ee',\n ttl_in_seconds: 7200,\n }),\n },\n);\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { share_token } = await response.json();" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.share(\"11111111-2222-3333-4444-555555555555\", {\n for_application_id: \"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n ttl_in_seconds: 7200,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Share(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsShareParams{\n\tForApplicationID: \"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n\tTTLInSeconds: didit.Int(7200),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsShareParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().share(\"11111111-2222-3333-4444-555555555555\", SessionsShareParams.builder()\n .forApplicationId(\"a5f3bca2-46e2-411e-90ef-a580900a57ee\")\n .ttlInSeconds(7200L)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->share('11111111-2222-3333-4444-555555555555', [\n 'for_application_id' => 'a5f3bca2-46e2-411e-90ef-a580900a57ee',\n 'ttl_in_seconds' => 7200,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.share(\n \"11111111-2222-3333-4444-555555555555\",\n for_application_id: \"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n ttl_in_seconds: 7200\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ShareAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsShareParams\n{\n ForApplicationId = \"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n TtlInSeconds = 7200,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -11693,7 +12360,7 @@ } }, "403": { - "description": "Missing/invalid API key (this endpoint returns `403`, never `401`, for authentication failures), or this source session has already been imported into the calling application (one redeem per receiver).", + "description": "Missing API key (a wrong, revoked or expired key gets `401`), or this source session has already been imported into the calling application (one redeem per receiver).", "content": { "application/json": { "examples": { @@ -11788,12 +12455,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/session/import-shared/\",\n headers={\n 'x-api-key': 'YOUR_API_KEY',\n \"Content-Type\": \"application/json\",\n },\n json={\n \"share_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n \"trust_review\": False,\n \"workflow_id\": \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n \"vendor_data\": \"user-1\",\n },\n)\nresponse.raise_for_status()\nimported = response.json()" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.import_shared(\n share_token=\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n trust_review=False,\n workflow_id=\"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n vendor_data=\"user-1\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const response = await fetch(\n 'https://verification.didit.me/v3/session/import-shared/',\n {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n share_token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n trust_review: false,\n workflow_id: '9f9b1234-aaaa-bbbb-cccc-1234567890ab',\n vendor_data: 'user-1',\n }),\n },\n);\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst imported = await response.json();" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.importShared({\n share_token: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n trust_review: false,\n workflow_id: \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n vendor_data: \"user-1\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ImportShared(ctx, didit.SessionsImportSharedParams{\n\tShareToken: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n\tTrustReview: false,\n\tWorkflowID: \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n\tVendorData: didit.String(\"user-1\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsImportSharedParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().importShared(SessionsImportSharedParams.builder()\n .shareToken(\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\")\n .trustReview(false)\n .workflowId(\"9f9b1234-aaaa-bbbb-cccc-1234567890ab\")\n .vendorData(\"user-1\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->importShared([\n 'share_token' => 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n 'trust_review' => false,\n 'workflow_id' => '9f9b1234-aaaa-bbbb-cccc-1234567890ab',\n 'vendor_data' => 'user-1',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.import_shared(\n share_token: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n trust_review: false,\n workflow_id: \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n vendor_data: \"user-1\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ImportSharedAsync(new SessionsImportSharedParams\n{\n ShareToken = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n TrustReview = false,\n WorkflowId = \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n VendorData = \"user-1\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -11880,6 +12572,12 @@ "description": "Switches the search to asynchronous mode: the API returns immediately and POSTs an unsigned `kyb.registry_search.resolved` callback to this URL when the candidate list is ready." } } + }, + "example": { + "country_code": "GB", + "name": "Tesco", + "search_type": "contains", + "vendor_data": "company-1234" } } } @@ -11893,12 +12591,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/kyb/search/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n json={\"country_code\": \"GB\", \"name\": \"Tesco\"},\n timeout=60, # synchronous mode waits for the registry to resolve\n)\nresp.raise_for_status()\ncandidates = resp.json()[\"kyb_registry\"][\"companies\"]\nkyb_response_id = candidates[0][\"kyb_response_id\"] # pass to /v3/kyb/select/" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.kyb.search(\n country_code=\"GB\",\n name=\"Tesco\",\n search_type=\"contains\",\n vendor_data=\"company-1234\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/kyb/search/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ country_code: 'GB', name: 'Tesco' }),\n});\nconst data = await res.json();\nconst kybResponseId = data.kyb_registry.companies[0].kyb_response_id;" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.kyb.search({\n country_code: \"GB\",\n name: \"Tesco\",\n search_type: \"contains\",\n vendor_data: \"company-1234\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.KYB.Search(ctx, didit.KYBSearchParams{\n\tCountryCode: \"GB\",\n\tName: didit.String(\"Tesco\"),\n\tSearchType: didit.Some(didit.KYBSearchParamsSearchType(\"contains\")),\n\tVendorData: didit.String(\"company-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.KybSearchParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.kyb().search(KybSearchParams.builder()\n .countryCode(\"GB\")\n .name(\"Tesco\")\n .searchType(KybSearchParams.SearchType.of(\"contains\"))\n .vendorData(\"company-1234\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "kyb->search([\n 'country_code' => 'GB',\n 'name' => 'Tesco',\n 'search_type' => 'contains',\n 'vendor_data' => 'company-1234',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.kyb.search(\n country_code: \"GB\",\n name: \"Tesco\",\n search_type: \"contains\",\n vendor_data: \"company-1234\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Kyb.SearchAsync(new KybSearchParams\n{\n CountryCode = \"GB\",\n Name = \"Tesco\",\n SearchType = new KybSearchParamsSearchType(\"contains\"),\n VendorData = \"company-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -11998,7 +12721,7 @@ } }, "400": { - "description": "Validation error. Field-level problems use DRF's standard envelope; the name/registration-number rule reports under `non_field_errors`.", + "description": "Validation error. Field-level problems use DRF's standard envelope; the name/registration-number rule reports under `non_field_errors`. A country the registries do not cover answers `400` with `code: kyb_registry_country_unsupported`.", "content": { "application/json": { "examples": { @@ -12033,13 +12756,20 @@ "Enter a valid URL." ] } + }, + "Country not covered": { + "summary": "No company registry covers the country", + "value": { + "detail": "Company registry search is not available for this country. Enter the company details manually to continue.", + "code": "kyb_registry_country_unsupported" + } } } } } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Also returned before searching when the applicable search fee cannot be covered (`code: \"insufficient_credits\"`), or when a contract search rate is missing.", + "description": "Permission denied. Returned when the `x-api-key` header is missing; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Also returned before searching when the applicable search fee cannot be covered (`code: \"insufficient_credits\"`), or when a contract search rate is missing.", "content": { "application/json": { "examples": { @@ -12054,7 +12784,7 @@ } }, "429": { - "description": "Rate limit exceeded. All POST/PATCH/DELETE endpoints share a budget of 300 write requests per minute per API key. The response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`, and `Retry-After` headers.", + "description": "Rate limit exceeded, or the search allowance is spent. All POST/PATCH/DELETE endpoints share a budget of 300 write requests per minute per API key, with `X-RateLimit-*` and `Retry-After` headers. Separately, paid registry searches are limited to 600 per application per hour: past that the response is `429` with `code: kyb_registry_search_limit_reached`, and searches served only by free sources still work. Wait and search again later.", "content": { "application/json": { "examples": { @@ -12063,6 +12793,13 @@ "value": { "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute." } + }, + "Search allowance spent": { + "summary": "More than 600 paid searches in the last hour", + "value": { + "detail": "The maximum number of company registry searches for this session has been reached. Enter the company details manually to continue.", + "code": "kyb_registry_search_limit_reached" + } } }, "schema": { @@ -12070,6 +12807,9 @@ "properties": { "detail": { "type": "string" + }, + "code": { + "type": "string" } } } @@ -12132,6 +12872,10 @@ "application/json": { "schema": { "$ref": "#/components/schemas/KYBRegistryCandidateRequest" + }, + "example": { + "kyb_response_id": "69aeeb95febb0f1704042259", + "vendor_data": "company-1234" } } } @@ -12145,12 +12889,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nsearch = requests.post(\n \"https://verification.didit.me/v3/kyb/search/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n json={\"country_code\": \"GB\", \"name\": \"Tesco\"},\n timeout=60,\n).json()\nkyb_response_id = search[\"kyb_registry\"][\"companies\"][0][\"kyb_response_id\"]\n\nresp = requests.post(\n \"https://verification.didit.me/v3/kyb/select/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n json={\"kyb_response_id\": kyb_response_id, \"vendor_data\": \"company-1234\"},\n timeout=90, # waits for the registry to resolve the full profile\n)\nresp.raise_for_status()\ncompany = resp.json()[\"kyb_registry\"]\nprint(company[\"company_name\"], company[\"registry_status\"], company[\"status\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.kyb.select(\n kyb_response_id=\"69aeeb95febb0f1704042259\",\n vendor_data=\"company-1234\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/kyb/select/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n kyb_response_id: '69aeeb95febb0f1704042259',\n vendor_data: 'company-1234',\n }),\n});\nconst data = await res.json();\nconsole.log(data.kyb_registry.company_name, data.kyb_registry.registry_status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.kyb.select({\n kyb_response_id: \"69aeeb95febb0f1704042259\",\n vendor_data: \"company-1234\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.KYB.Select(ctx, didit.KYBRegistryCandidateRequest{\n\tKYBResponseID: \"69aeeb95febb0f1704042259\",\n\tVendorData: didit.String(\"company-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.KYBRegistryCandidateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.kyb().select(KYBRegistryCandidateRequest.builder()\n .kybResponseId(\"69aeeb95febb0f1704042259\")\n .vendorData(\"company-1234\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "kyb->select([\n 'kyb_response_id' => '69aeeb95febb0f1704042259',\n 'vendor_data' => 'company-1234',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.kyb.select(\n kyb_response_id: \"69aeeb95febb0f1704042259\",\n vendor_data: \"company-1234\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Kyb.SelectAsync(new KYBRegistryCandidateRequest\n{\n KybResponseId = \"69aeeb95febb0f1704042259\",\n VendorData = \"company-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -12656,8 +13425,7 @@ "description": "Registry filing dates, when available. Annual returns and general meetings use last_annual_return_date and last_agm_date; they are distinct from financial accounts." }, "registry_data": { - "type": "object", - "description": "Raw record returned by the registry source, kept for reviewers. Its shape differs by country and source and is not a stable contract: read the canonical fields (`addresses`, `industries`, `ownership`, `beneficial_owners[].shareholding`) instead." + "$ref": "#/components/schemas/KYBRegistryData" }, "user_provided_data": { "type": "object", @@ -12707,6 +13475,55 @@ "type": "string", "nullable": true, "description": "The registry tier the workflow ordered: `basic`, `shareholders` or `ubo`. Also in `ownership.tier_requested`." + }, + "registry_monitoring": { + "type": "object", + "nullable": true, + "description": "The latest registry monitor for the company, or `null` when none exists.", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "status": { + "type": "string" + }, + "unavailable_reason": { + "type": "string", + "nullable": true + }, + "enrolled_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "cancelled_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "last_bill_date": { + "type": "string", + "format": "date", + "nullable": true + }, + "next_bill_date": { + "type": "string", + "format": "date", + "nullable": true + }, + "last_event_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "events_count": { + "type": "integer" + }, + "watched_fields": { + "description": "The company fields the monitor watches." + } + } } } }, @@ -12802,24 +13619,7 @@ "next_account": "26 February 2026", "due_by_date": "26 August 2026" }, - "registry_data": { - "name": "Tesco PLC", - "registration_number": "00445790", - "status": "active", - "type": "Public Limited Company", - "incorporation_date": "1947-11-27", - "tax_number": "GB412 8925 93", - "country_code": "GB", - "fetch_status": "resolved", - "industries_detail": [ - { - "code": "47110", - "name": "Retail Sale In Non-specialised Stores With Food, Beverages Or Tobacco Predominating", - "description": null, - "meta_detail": [] - } - ] - }, + "registry_data": {}, "user_provided_data": null, "confirmed_by_user_at": null, "last_console_edit_at": null, @@ -12884,7 +13684,7 @@ } }, "400": { - "description": "Validation error. Field-level problems use DRF's standard envelope.", + "description": "Validation error. Field-level problems use DRF's standard envelope. A country the registries do not cover answers `400` with `code: kyb_registry_country_unsupported`.", "content": { "application/json": { "examples": { @@ -12903,13 +13703,20 @@ "KYB registry select must be saved so billing and retrieval can be tracked." ] } + }, + "Country not covered": { + "summary": "No company registry covers the country", + "value": { + "detail": "Company registry search is not available for this country. Enter the company details manually to continue.", + "code": "kyb_registry_country_unsupported" + } } } } } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any screening or provider call happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any screening or provider call happens.", "content": { "application/json": { "examples": { @@ -13404,7 +14211,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any image processing happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any image processing happens.", "content": { "application/json": { "examples": { @@ -13462,12 +14269,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nurl = 'https://verification.didit.me/v3/passive-liveness/'\nheaders = {'x-api-key': 'YOUR_API_KEY'}\n\nwith open('selfie.jpg', 'rb') as f:\n files = {'user_image': ('selfie.jpg', f, 'image/jpeg')}\n data = {\n 'face_liveness_score_decline_threshold': 30,\n 'save_api_request': 'true',\n 'vendor_data': 'user-123',\n }\n resp = requests.post(url, headers=headers, files=files, data=data, timeout=60)\n\nresp.raise_for_status()\nbody = resp.json()\nprint('status:', body['liveness']['status'])\nprint('score:', body['liveness']['score'])\nfor w in body['liveness']['warnings']:\n print('warning:', w['risk'], '-', w['log_type'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.passive_liveness.check(\n user_image=open(\"user_image.jpg\", \"rb\"),\n face_liveness_score_decline_threshold=30.0,\n rotate_image=False,\n save_api_request=True,\n vendor_data=\"user-123\",\n metadata={\"flow\": \"withdrawal\"},\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import fs from 'node:fs';\n\nconst form = new FormData();\nform.append('user_image', new Blob([fs.readFileSync('./selfie.jpg')]), 'selfie.jpg');\nform.append('face_liveness_score_decline_threshold', '30');\nform.append('save_api_request', 'true');\nform.append('vendor_data', 'user-123');\n\nconst response = await fetch('https://verification.didit.me/v3/passive-liveness/', {\n method: 'POST',\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n body: form,\n});\n\nif (!response.ok) throw new Error(`Passive liveness failed: ${response.status}`);\nconst body = await response.json();\nconsole.log('status:', body.liveness.status, 'score:', body.liveness.score);\nbody.liveness.warnings.forEach(w => console.log('warning:', w.risk, '-', w.log_type));" + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.passiveLiveness.check({\n user_image: await fileFromPath(\"user_image.jpg\"),\n face_liveness_score_decline_threshold: 30.0,\n rotate_image: false,\n save_api_request: true,\n vendor_data: \"user-123\",\n metadata: { flow: \"withdrawal\" },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.PassiveLiveness.Check(ctx, didit.PassiveLivenessCheckParams{\n\tUserImage: didit.FileFromPath(\"user_image.jpg\"),\n\tFaceLivenessScoreDeclineThreshold: didit.Float(30.0),\n\tRotateImage: didit.Bool(false),\n\tSaveAPIRequest: didit.Bool(true),\n\tVendorData: didit.String(\"user-123\"),\n\tMetadata: didit.Some(map[string]any{\"flow\": \"withdrawal\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.PassiveLivenessCheckParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.passiveLiveness().check(PassiveLivenessCheckParams.builder()\n .userImage(Path.of(\"user_image.jpg\"))\n .faceLivenessScoreDeclineThreshold(30.0)\n .rotateImage(false)\n .saveApiRequest(true)\n .vendorData(\"user-123\")\n .metadata(Map.of(\"flow\", \"withdrawal\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "passiveLiveness->check([\n 'user_image' => File::fromPath('user_image.jpg'),\n 'face_liveness_score_decline_threshold' => 30.0,\n 'rotate_image' => false,\n 'save_api_request' => true,\n 'vendor_data' => 'user-123',\n 'metadata' => ['flow' => 'withdrawal'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.passive_liveness.check(\n user_image: Pathname(\"user_image.jpg\"),\n face_liveness_score_decline_threshold: 30.0,\n rotate_image: false,\n save_api_request: true,\n vendor_data: \"user-123\",\n metadata: { flow: \"withdrawal\" }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.PassiveLiveness.CheckAsync(new PassiveLivenessCheckParams\n{\n UserImage = FileUpload.FromPath(\"user_image.jpg\"),\n FaceLivenessScoreDeclineThreshold = 30.0,\n RotateImage = false,\n SaveApiRequest = true,\n VendorData = \"user-123\",\n Metadata = new Dictionary { [\"flow\"] = \"withdrawal\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -13789,6 +14621,70 @@ "type": "string", "description": "Bank card number (CHN bank-card verification)." }, + "company_registration_number": { + "type": "string", + "description": "Company registration number as issued by the companies register: the CNPJ in Brazil (e.g. `11222333000181`), the registration number in South Africa (e.g. `1936/007721/06`). Required by the company registry and company directors services (`bra_company_registry`, `bra_company_directors`, `zaf_company_registry`, `zaf_company_directors`)." + }, + "company_name": { + "type": "string", + "description": "Registered company name, cross-checked against the register entry. Optional for `zaf_company_registry`." + }, + "initials": { + "type": "string", + "description": "The person's initials as printed on the document. Required by `zaf_drivers_license`; accepted by `zaf_bank_account_holder`." + }, + "licence_number": { + "type": "string", + "description": "Driving licence number as printed on the card, for `zaf_drivers_license`. When omitted, `document_number` is used." + }, + "refugee_file_number": { + "type": "string", + "description": "Refugee file number issued by South Africa's Department of Home Affairs. Required by `zaf_refugee`." + }, + "bank_name": { + "type": "string", + "description": "Name of the bank that holds the account. Required by `zaf_bank_account_holder`." + }, + "bank_account_number": { + "type": "string", + "description": "Bank account number. Required by `zaf_bank_account_holder`; accepted by `zaf_fraud_prevention`." + }, + "account_type": { + "type": "string", + "description": "Bank account type for `zaf_bank_account_holder`: `current`, `savings`, `transmission`, `subscriptionShare` or `notKnown`, case-insensitive. Any other value returns `400`. Omit it when you do not know the type: the account-type cross-check is then reported as not confirmed." + }, + "phone_number": { + "type": "string", + "description": "Contact mobile number, for the services that cross-check contactability (`zaf_bank_account_holder`, `zaf_fraud_prevention`, `zaf_refugee`)." + }, + "right_thumb": { + "type": "string", + "description": "Base64-encoded right thumb fingerprint for `zaf_dha_fingerprint_match`, with `left_thumb` or on its own." + }, + "left_thumb": { + "type": "string", + "description": "Base64-encoded left thumb fingerprint for `zaf_dha_fingerprint_match`, with `right_thumb` or on its own." + }, + "score_level": { + "type": "integer", + "description": "Minimum biometric score level for `zaf_criminal_face_screening`. Defaults to `3`." + }, + "max_matches": { + "type": "integer", + "description": "Maximum number of candidate matches `zaf_criminal_face_screening` returns. Defaults to `1`." + }, + "vehicle_register_number": { + "type": "string", + "description": "Vehicle register number. Required, with `vehicle_licence_plate` and `vin`, by `zaf_vehicle_ownership`." + }, + "vehicle_licence_plate": { + "type": "string", + "description": "Vehicle licence plate number. Required, with `vehicle_register_number` and `vin`, by `zaf_vehicle_ownership`." + }, + "vin": { + "type": "string", + "description": "Vehicle Identification Number (VIN or chassis number). Required, with `vehicle_register_number` and `vehicle_licence_plate`, by `zaf_vehicle_ownership`." + }, "ssn": { "type": "string", "description": "Social Security Number (USA)." @@ -13844,6 +14740,17 @@ "description": "Free-form JSON stored with the request and echoed back." } } + }, + "example": { + "issuing_state": "BRA", + "services": [ + "bra_cpf" + ], + "identification_number": "12345678900", + "first_name": "John", + "last_name": "Doe", + "date_of_birth": "1980-01-01", + "vendor_data": "user-1234" } }, "multipart/form-data": { @@ -14140,6 +15047,70 @@ "type": "string", "description": "Bank card number (CHN bank-card verification)." }, + "company_registration_number": { + "type": "string", + "description": "Company registration number as issued by the companies register: the CNPJ in Brazil (e.g. `11222333000181`), the registration number in South Africa (e.g. `1936/007721/06`). Required by the company registry and company directors services (`bra_company_registry`, `bra_company_directors`, `zaf_company_registry`, `zaf_company_directors`)." + }, + "company_name": { + "type": "string", + "description": "Registered company name, cross-checked against the register entry. Optional for `zaf_company_registry`." + }, + "initials": { + "type": "string", + "description": "The person's initials as printed on the document. Required by `zaf_drivers_license`; accepted by `zaf_bank_account_holder`." + }, + "licence_number": { + "type": "string", + "description": "Driving licence number as printed on the card, for `zaf_drivers_license`. When omitted, `document_number` is used." + }, + "refugee_file_number": { + "type": "string", + "description": "Refugee file number issued by South Africa's Department of Home Affairs. Required by `zaf_refugee`." + }, + "bank_name": { + "type": "string", + "description": "Name of the bank that holds the account. Required by `zaf_bank_account_holder`." + }, + "bank_account_number": { + "type": "string", + "description": "Bank account number. Required by `zaf_bank_account_holder`; accepted by `zaf_fraud_prevention`." + }, + "account_type": { + "type": "string", + "description": "Bank account type for `zaf_bank_account_holder`: `current`, `savings`, `transmission`, `subscriptionShare` or `notKnown`, case-insensitive. Any other value returns `400`. Omit it when you do not know the type: the account-type cross-check is then reported as not confirmed." + }, + "phone_number": { + "type": "string", + "description": "Contact mobile number, for the services that cross-check contactability (`zaf_bank_account_holder`, `zaf_fraud_prevention`, `zaf_refugee`)." + }, + "right_thumb": { + "type": "string", + "description": "Base64-encoded right thumb fingerprint for `zaf_dha_fingerprint_match`, with `left_thumb` or on its own." + }, + "left_thumb": { + "type": "string", + "description": "Base64-encoded left thumb fingerprint for `zaf_dha_fingerprint_match`, with `right_thumb` or on its own." + }, + "score_level": { + "type": "integer", + "description": "Minimum biometric score level for `zaf_criminal_face_screening`. Defaults to `3`." + }, + "max_matches": { + "type": "integer", + "description": "Maximum number of candidate matches `zaf_criminal_face_screening` returns. Defaults to `1`." + }, + "vehicle_register_number": { + "type": "string", + "description": "Vehicle register number. Required, with `vehicle_licence_plate` and `vin`, by `zaf_vehicle_ownership`." + }, + "vehicle_licence_plate": { + "type": "string", + "description": "Vehicle licence plate number. Required, with `vehicle_register_number` and `vin`, by `zaf_vehicle_ownership`." + }, + "vin": { + "type": "string", + "description": "Vehicle Identification Number (VIN or chassis number). Required, with `vehicle_register_number` and `vehicle_licence_plate`, by `zaf_vehicle_ownership`." + }, "ssn": { "type": "string", "description": "Social Security Number (USA)." @@ -14213,12 +15184,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/database-validation/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n json={\n \"issuing_state\": \"BRA\",\n \"services\": [\"bra_cpf\"],\n \"identification_number\": \"12345678900\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"date_of_birth\": \"1980-01-01\",\n \"vendor_data\": \"user-1234\",\n },\n timeout=45,\n)\nresp.raise_for_status()\ndv = resp.json()[\"database_validation\"]\nprint(dv[\"status\"], dv[\"match_type\"]) # e.g. Approved full_match\n\n# Biometric services need a selfie via multipart/form-data:\n# requests.post(..., data={\"issuing_state\": \"ARG\", \"services\": '[\"arg_renaper\"]',\n# \"identification_number\": \"12345678\", \"gender\": \"M\", ...},\n# files={\"selfie\": open(\"selfie.jpg\", \"rb\")})" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.database_validation.validate(\n issuing_state=\"BRA\",\n services=[\"bra_cpf\"],\n identification_number=\"12345678900\",\n first_name=\"John\",\n last_name=\"Doe\",\n date_of_birth=\"1980-01-01\",\n vendor_data=\"user-1234\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/database-validation/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n issuing_state: 'BRA',\n services: ['bra_cpf'],\n identification_number: '12345678900',\n first_name: 'John',\n last_name: 'Doe',\n date_of_birth: '1980-01-01',\n vendor_data: 'user-1234',\n }),\n});\nconst data = await res.json();\nconsole.log(data.database_validation.status, data.database_validation.match_type);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.databaseValidation.validate({\n issuing_state: \"BRA\",\n services: [\"bra_cpf\"],\n identification_number: \"12345678900\",\n first_name: \"John\",\n last_name: \"Doe\",\n date_of_birth: \"1980-01-01\",\n vendor_data: \"user-1234\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.DatabaseValidation.Validate(ctx, didit.DatabaseValidationValidateParams{\n\tIssuingState: \"BRA\",\n\tServices: didit.Some([]string{\"bra_cpf\"}),\n\tIdentificationNumber: didit.String(\"12345678900\"),\n\tFirstName: didit.String(\"John\"),\n\tLastName: didit.String(\"Doe\"),\n\tDateOfBirth: didit.String(\"1980-01-01\"),\n\tVendorData: didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.LocalDate;\nimport java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.DatabaseValidationValidateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.databaseValidation().validate(DatabaseValidationValidateParams.builder()\n .issuingState(\"BRA\")\n .services(List.of(\"bra_cpf\"))\n .identificationNumber(\"12345678900\")\n .firstName(\"John\")\n .lastName(\"Doe\")\n .dateOfBirth(LocalDate.parse(\"1980-01-01\"))\n .vendorData(\"user-1234\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "databaseValidation->validate([\n 'issuing_state' => 'BRA',\n 'services' => ['bra_cpf'],\n 'identification_number' => '12345678900',\n 'first_name' => 'John',\n 'last_name' => 'Doe',\n 'date_of_birth' => '1980-01-01',\n 'vendor_data' => 'user-1234',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.database_validation.validate(\n issuing_state: \"BRA\",\n services: [\"bra_cpf\"],\n identification_number: \"12345678900\",\n first_name: \"John\",\n last_name: \"Doe\",\n date_of_birth: \"1980-01-01\",\n vendor_data: \"user-1234\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.DatabaseValidation.ValidateAsync(new DatabaseValidationValidateParams\n{\n IssuingState = \"BRA\",\n Services = new string[] { \"bra_cpf\" },\n IdentificationNumber = \"12345678900\",\n FirstName = \"John\",\n LastName = \"Doe\",\n DateOfBirth = \"1980-01-01\",\n VendorData = \"user-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -14761,7 +15757,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any screening or provider call happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any screening or provider call happens.", "content": { "application/json": { "examples": { @@ -14882,12 +15878,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/phone/send/\",\n headers={\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Content-Type\": \"application/json\",\n },\n json={\n \"phone_number\": \"+14155552671\",\n \"options\": {\n \"code_size\": 6,\n \"preferred_channel\": \"whatsapp\",\n \"locale\": \"en-US\",\n },\n \"vendor_data\": \"user-1234\",\n },\n timeout=15,\n)\nresp.raise_for_status()\nprint(resp.json()) # {request_id, status, reason, vendor_data, metadata}\n# Then verify with POST /v3/phone/check/ using the same phone_number" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.phone.send_code(\n phone_number=\"+14155552671\",\n options={\n \"locale\": \"en-US\",\n \"preferred_channel\": \"whatsapp\",\n },\n vendor_data=\"user-1234\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/phone/send/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n phone_number: '+14155552671',\n options: { code_size: 6, preferred_channel: 'whatsapp', locale: 'en-US' },\n vendor_data: 'user-1234',\n }),\n});\nif (!res.ok) throw new Error(`Phone send failed: ${res.status}`);\nconst data = await res.json();\nconsole.log(data); // { request_id, status, reason, vendor_data, metadata }\n// Then verify with POST /v3/phone/check/ using the same phone_number" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.phone.sendCode({\n phone_number: \"+14155552671\",\n options: {\n locale: \"en-US\",\n preferred_channel: \"whatsapp\",\n },\n vendor_data: \"user-1234\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Phone.SendCode(ctx, didit.PhoneSendCodeParams{\n\tPhoneNumber: \"+14155552671\",\n\tOptions: didit.Some(didit.PhoneSendCodeParamsOptions{\n\t\tLocale: didit.String(\"en-US\"),\n\t\tPreferredChannel: didit.Some(didit.PhoneSendCodeParamsOptionsPreferredChannel(\"whatsapp\")),\n\t}),\n\tVendorData: didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.PhoneSendCodeParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.phone().sendCode(PhoneSendCodeParams.builder()\n .phoneNumber(\"+14155552671\")\n .options(PhoneSendCodeParams.Options.builder()\n .locale(\"en-US\")\n .preferredChannel(PhoneSendCodeParams.Options.PreferredChannel.of(\"whatsapp\"))\n .build())\n .vendorData(\"user-1234\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "phone->sendCode([\n 'phone_number' => '+14155552671',\n 'options' => [\n 'locale' => 'en-US',\n 'preferred_channel' => 'whatsapp',\n ],\n 'vendor_data' => 'user-1234',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.phone.send_code(\n phone_number: \"+14155552671\",\n options: {\n locale: \"en-US\",\n preferred_channel: \"whatsapp\",\n },\n vendor_data: \"user-1234\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Phone.SendCodeAsync(new PhoneSendCodeParams\n{\n PhoneNumber = \"+14155552671\",\n Options = new PhoneSendCodeParamsOptions\n {\n Locale = \"en-US\",\n PreferredChannel = new PhoneSendCodeParamsOptionsPreferredChannel(\"whatsapp\"),\n },\n VendorData = \"user-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -15155,7 +16176,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment (`{\"detail\": ...}`) — this API never returns `401`. Also returned before any send when the organization has never topped up (anti-abuse gate) or when its balance cannot cover the destination's send price (`{\"error\": ...}`).", + "description": "Permission denied. Returned when the `x-api-key` header is missing (`{\"detail\": ...}`); a wrong, revoked or expired key returns `401`. Also returned before any send when the organization has never topped up (anti-abuse gate) or when its balance cannot cover the destination's send price (`{\"error\": ...}`).", "content": { "application/json": { "examples": { @@ -15291,12 +16312,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/phone/check/\",\n headers={\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Content-Type\": \"application/json\",\n },\n json={\n \"phone_number\": \"+14155552671\", # same number as the send call\n \"code\": \"123456\",\n \"voip_number_action\": \"DECLINE\",\n },\n timeout=15,\n)\nresp.raise_for_status()\nresult = resp.json()\nprint(result[\"status\"]) # Approved / Declined / Failed / Expired or Not Found\nif result[\"status\"] in (\"Approved\", \"Declined\"):\n print(result[\"phone\"][\"carrier\"], result[\"phone\"][\"is_virtual\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.phone.check_code(\n phone_number=\"+14155552671\",\n code=\"123456\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/phone/check/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n phone_number: '+14155552671', // same number as the send call\n code: '123456',\n voip_number_action: 'DECLINE',\n }),\n});\nconst data = await res.json();\nif (data.status === 'Approved') {\n // full phone report is in data.phone (carrier, is_virtual, matches, ...)\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.phone.checkCode({\n phone_number: \"+14155552671\",\n code: \"123456\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Phone.CheckCode(ctx, didit.PhoneCheckCodeParams{\n\tPhoneNumber: \"+14155552671\",\n\tCode: \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.PhoneCheckCodeParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.phone().checkCode(PhoneCheckCodeParams.builder()\n .phoneNumber(\"+14155552671\")\n .code(\"123456\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "phone->checkCode([\n 'phone_number' => '+14155552671',\n 'code' => '123456',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.phone.check_code(\n phone_number: \"+14155552671\",\n code: \"123456\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Phone.CheckCodeAsync(new PhoneCheckCodeParams\n{\n PhoneNumber = \"+14155552671\",\n Code = \"123456\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -15347,6 +16393,48 @@ "default": "NO_ACTION", "description": "What to do when the carrier lookup reports a virtual line type — `voip`, `isp`, or `vpn` (`phone.is_virtual`). `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the risk in `phone.warnings`." }, + "enable_enrichment": { + "type": "boolean", + "default": false, + "description": "When `true`, also run phone intelligence on the number: a risk score, the line type, whether it was recently ported and a trust index. Billed as one `phone_intelligence_api` unit per request ($0.05 at list price) in addition to this endpoint's own price. The request returns `403` when your balance cannot cover it.", + "example": false + }, + "phone_intelligence_score_action": { + "type": "string", + "enum": [ + "NO_ACTION", + "DECLINE" + ], + "default": "NO_ACTION", + "description": "Action when the phone intelligence risk score is above the threshold. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is `true`." + }, + "phone_type_risk_action": { + "type": "string", + "enum": [ + "NO_ACTION", + "DECLINE" + ], + "default": "NO_ACTION", + "description": "Action when the number is a high-risk line type. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is `true`." + }, + "recent_port_action": { + "type": "string", + "enum": [ + "NO_ACTION", + "DECLINE" + ], + "default": "NO_ACTION", + "description": "Action when the number was ported to another carrier recently. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is `true`." + }, + "low_phone_trust_action": { + "type": "string", + "enum": [ + "NO_ACTION", + "DECLINE" + ], + "default": "NO_ACTION", + "description": "Action when the phone intelligence trust index is at or below the threshold. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is `true`." + }, "enable_social": { "type": "boolean", "default": false, @@ -15682,7 +16770,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — this API never returns `401`. Checks are free, so there is no credit check here.", + "description": "Permission denied. Returned when the `x-api-key` header is missing; a wrong, revoked or expired key returns `401`. Checks are free, so there is no credit check here.", "content": { "application/json": { "examples": { @@ -15786,7 +16874,7 @@ "/v3/bank/account-check/": { "post": { "summary": "Check a bank account", - "description": "Check that a bank account belongs to the person or company you name, before you send money to it. No session and no sign-in: send the name and the account, read the result. It is the [account check](/core-technology/bank-verification/account-check) of the Bank Verification step, run from your backend.\n\n**What you send.** The account's `country` (ISO 3166-1 alpha-3), the `account` the way that country writes it, and the `holder` name: `full_name` for a person or `business_name` for a company. A business name checks a business account.\n\n**What you get back.** `result` is `match`, `close_match`, `no_match` or `cannot_verify`. On a `close_match`, `holder_name` is the name the bank holds the account under, when the bank returned it. `account` comes back masked to its last 4 characters.\n\n**Billing.** Each check the bank answers is billed once at the Account check price of the account's country, whatever the result: a `no_match`, an account that does not exist and a `cannot_verify` are billed too. A request answered with an error is never billed.\n\n**Every request is a new check.** There is no idempotency key and no endpoint to read a check back, so a retried request runs, and is billed, again. Store the response.\n\n**Sandbox.** A sandbox key calls no bank and is charged nothing. The last 4 characters of the IBAN, else of the account number, choose the answer: `0001` a `close_match` with a `holder_name`, `0002` a `close_match` without one, `0003` and `0006` a `no_match`, `0004` `cannot_verify`, `0005` a `503` and `0009` a `400`. Any other ending is a `match`.\n\n**API keys.** A scoped API key needs write access to sessions.", + "description": "**Not available in production yet.** Bank Verification is switched off in production, so until it is switched on this endpoint answers `404` with `bank_verification_not_available`. Do not build on it yet. The rest of this description is what the endpoint does once it is available.\n\nCheck that a bank account belongs to the person or company you name, before you send money to it. No session and no sign-in: send the name and the account, read the result. It is the [account check](/core-technology/bank-verification/account-check) of the Bank Verification step, run from your backend.\n\n**What you send.** The account's `country` (ISO 3166-1 alpha-3), the `account` the way that country writes it, and the `holder` name: `full_name` for a person or `business_name` for a company. A business name checks a business account.\n\n**What you get back.** `result` is `match`, `close_match`, `no_match` or `cannot_verify`. On a `close_match`, `holder_name` is the name the bank holds the account under, when the bank returned it. `account` comes back masked to its last 4 characters.\n\n**Billing.** Each check the bank answers is billed once at the Account check price of the account's country, whatever the result: a `no_match`, an account that does not exist and a `cannot_verify` are billed too. A request answered with an error is never billed.\n\n**Every request is a new check.** There is no idempotency key and no endpoint to read a check back, so a retried request runs, and is billed, again. Store the response.\n\n**Sandbox.** Where Bank Verification is available, a sandbox key calls no bank and is charged nothing. The last 4 characters of the IBAN, else of the account number, choose the answer: `0001` a `close_match` with a `holder_name`, `0002` a `close_match` without one, `0003` and `0006` a `no_match`, `0004` `cannot_verify`, `0005` a `503` and `0009` a `400`. Any other ending is a `match`.\n\n**API keys.** A scoped API key needs write access to sessions.", "operationId": "post_v3_bank_account_check", "tags": [ "Standalone APIs" @@ -15995,7 +17083,7 @@ } }, "404": { - "description": "No account check serves this account yet, so nothing was checked or billed. `country_not_covered`: none serves its country, or its kind of account (person or business) there. `bank_not_covered`: none serves its bank. `bank_verification_not_available`: Bank Verification is not available yet.", + "description": "No account check serves this account yet, so nothing was checked or billed. `country_not_covered`: none serves its country, or its kind of account (person or business) there. `bank_not_covered`: none serves its bank. `bank_verification_not_available`: Bank Verification is not enabled in production yet, which is the answer for every request there until it is switched on.", "content": { "application/json": { "schema": { @@ -16052,12 +17140,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/bank/account-check/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n json={\n \"country\": \"GBR\",\n \"account\": {\"sort_code\": \"20-45-67\", \"account_number\": \"31926819\"},\n \"holder\": {\"full_name\": \"Maria Oliveira\"},\n \"vendor_data\": \"payout_20481\",\n },\n timeout=30,\n)\nresp.raise_for_status()\ncheck = resp.json()\nif check[\"result\"] == \"match\":\n pass # send the payout\nelif check[\"result\"] == \"close_match\":\n print(check[\"holder_name\"]) # the name the bank holds, when it returned one" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.bank.account_check(\n country=\"GBR\",\n account={\n \"account_number\": \"31926819\",\n \"sort_code\": \"20-45-67\",\n },\n holder={\n \"full_name\": \"Maria Oliveira\",\n },\n vendor_data=\"payout_20481\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/bank/account-check/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n country: 'GBR',\n account: { sort_code: '20-45-67', account_number: '31926819' },\n holder: { full_name: 'Maria Oliveira' },\n vendor_data: 'payout_20481',\n }),\n});\nconst check = await res.json();\n// check.result: match, close_match, no_match or cannot_verify" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.bank.accountCheck({\n country: \"GBR\",\n account: {\n account_number: \"31926819\",\n sort_code: \"20-45-67\",\n },\n holder: {\n full_name: \"Maria Oliveira\",\n },\n vendor_data: \"payout_20481\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Bank.AccountCheck(ctx, didit.BankAccountCheckRequest{\n\tCountry: \"GBR\",\n\tAccount: didit.BankAccountCheckRequestAccount{\n\t\tAccountNumber: didit.String(\"31926819\"),\n\t\tSortCode: didit.String(\"20-45-67\"),\n\t},\n\tHolder: didit.BankAccountCheckHolder{\n\t\tFullName: didit.String(\"Maria Oliveira\"),\n\t},\n\tVendorData: didit.String(\"payout_20481\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.BankAccountCheckHolder;\nimport me.didit.types.BankAccountCheckPersonHolder;\nimport me.didit.types.BankAccountCheckRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.bank().accountCheck(BankAccountCheckRequest.builder()\n .country(\"GBR\")\n .account(BankAccountCheckRequest.Account.builder()\n .accountNumber(\"31926819\")\n .sortCode(\"20-45-67\")\n .build())\n .holder(BankAccountCheckHolder.ofBankAccountCheckPersonHolder(BankAccountCheckPersonHolder.builder()\n .fullName(\"Maria Oliveira\")\n .build()))\n .vendorData(\"payout_20481\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "bank->accountCheck([\n 'country' => 'GBR',\n 'account' => [\n 'account_number' => '31926819',\n 'sort_code' => '20-45-67',\n ],\n 'holder' => [\n 'full_name' => 'Maria Oliveira',\n ],\n 'vendor_data' => 'payout_20481',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.bank.account_check(\n country: \"GBR\",\n account: {\n account_number: \"31926819\",\n sort_code: \"20-45-67\",\n },\n holder: {\n full_name: \"Maria Oliveira\",\n },\n vendor_data: \"payout_20481\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Bank.AccountCheckAsync(new BankAccountCheckRequest\n{\n Country = \"GBR\",\n Account = new()\n {\n AccountNumber = \"31926819\",\n SortCode = \"20-45-67\",\n },\n Holder = new()\n {\n FullName = \"Maria Oliveira\",\n },\n VendorData = \"payout_20481\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -16085,12 +17198,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/email/send/\",\n headers={\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Content-Type\": \"application/json\",\n },\n json={\n \"email\": \"alice@example.com\",\n \"options\": {\"code_size\": 6, \"locale\": \"en\"},\n \"vendor_data\": \"user-1234\",\n },\n timeout=15,\n)\nresp.raise_for_status()\nprint(resp.json()) # {request_id, status, reason, vendor_data, metadata}\n# Then verify with POST /v3/email/check/ using the same email" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.email.send_code(\n email=\"alice@example.com\",\n options={\n \"locale\": \"en\",\n },\n vendor_data=\"user-1234\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/email/send/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email: 'alice@example.com',\n options: { code_size: 6, locale: 'en' },\n vendor_data: 'user-1234',\n }),\n});\nif (!res.ok) throw new Error(`Email send failed: ${res.status}`);\nconst data = await res.json();\nconsole.log(data); // { request_id, status, reason, vendor_data, metadata }\n// Then verify with POST /v3/email/check/ using the same email" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.email.sendCode({\n email: \"alice@example.com\",\n options: {\n locale: \"en\",\n },\n vendor_data: \"user-1234\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Email.SendCode(ctx, didit.EmailSendCodeParams{\n\tEmail: \"alice@example.com\",\n\tOptions: didit.Some(didit.EmailSendCodeParamsOptions{\n\t\tLocale: didit.Some(didit.EmailSendCodeParamsOptionsLocale(\"en\")),\n\t}),\n\tVendorData: didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.EmailSendCodeParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.email().sendCode(EmailSendCodeParams.builder()\n .email(\"alice@example.com\")\n .options(EmailSendCodeParams.Options.builder()\n .locale(EmailSendCodeParams.Options.Locale.of(\"en\"))\n .build())\n .vendorData(\"user-1234\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "email->sendCode([\n 'email' => 'alice@example.com',\n 'options' => [\n 'locale' => 'en',\n ],\n 'vendor_data' => 'user-1234',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.email.send_code(\n email: \"alice@example.com\",\n options: {\n locale: \"en\",\n },\n vendor_data: \"user-1234\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Email.SendCodeAsync(new EmailSendCodeParams\n{\n Email = \"alice@example.com\",\n Options = new EmailSendCodeParamsOptions\n {\n Locale = new EmailSendCodeParamsOptionsLocale(\"en\"),\n },\n VendorData = \"user-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -16375,7 +17513,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment (`{\"detail\": ...}`) — this API never returns `401`. Also returned before any send when the organization's balance cannot cover one Email Verification API credit (`{\"error\": ...}`).", + "description": "Permission denied. Returned when the `x-api-key` header is missing (`{\"detail\": ...}`); a wrong, revoked or expired key returns `401`. Also returned before any send when the organization's balance cannot cover one Email Verification API credit (`{\"error\": ...}`).", "content": { "application/json": { "examples": { @@ -16472,12 +17610,37 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/email/check/\",\n headers={\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Content-Type\": \"application/json\",\n },\n json={\n \"email\": \"alice@example.com\", # same address as the send call\n \"code\": \"123456\",\n \"disposable_email_action\": \"DECLINE\",\n },\n timeout=15,\n)\nresp.raise_for_status()\nresult = resp.json()\nprint(result[\"status\"]) # Approved / Declined / Failed / Expired or Not Found\nif result[\"status\"] in (\"Approved\", \"Declined\"):\n print(result[\"email\"][\"is_breached\"], result[\"email\"][\"is_disposable\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.email.check_code(\n email=\"alice@example.com\",\n code=\"123456\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/email/check/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email: 'alice@example.com', // same address as the send call\n code: '123456',\n disposable_email_action: 'DECLINE',\n }),\n});\nconst data = await res.json();\nif (data.status === 'Approved') {\n // full email report is in data.email (breaches, is_disposable, matches, ...)\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.email.checkCode({\n email: \"alice@example.com\",\n code: \"123456\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Email.CheckCode(ctx, didit.EmailCheckCodeParams{\n\tEmail: \"alice@example.com\",\n\tCode: \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.EmailCheckCodeParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.email().checkCode(EmailCheckCodeParams.builder()\n .email(\"alice@example.com\")\n .code(\"123456\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "email->checkCode([\n 'email' => 'alice@example.com',\n 'code' => '123456',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.email.check_code(\n email: \"alice@example.com\",\n code: \"123456\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Email.CheckCodeAsync(new EmailCheckCodeParams\n{\n Email = \"alice@example.com\",\n Code = \"123456\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -16526,6 +17689,39 @@ "default": "NO_ACTION", "description": "What to do when the domain belongs to a disposable/temporary-mail provider (`email.is_disposable`). `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the risk in `email.warnings`." }, + "enable_enrichment": { + "type": "boolean", + "default": false, + "description": "When `true`, also run email intelligence on the address: a risk score and its breach history. Billed as one `email_intelligence_api` unit per request ($0.05 at list price) in addition to this endpoint's own price. The request returns `403` when your balance cannot cover it.", + "example": false + }, + "email_intelligence_score_action": { + "type": "string", + "enum": [ + "NO_ACTION", + "DECLINE" + ], + "default": "NO_ACTION", + "description": "Action when the email intelligence risk score is above the threshold. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is `true`." + }, + "recent_email_breach_action": { + "type": "string", + "enum": [ + "NO_ACTION", + "DECLINE" + ], + "default": "NO_ACTION", + "description": "Action when the address appears in a recent known data breach. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is `true`." + }, + "frequent_email_breach_action": { + "type": "string", + "enum": [ + "NO_ACTION", + "DECLINE" + ], + "default": "NO_ACTION", + "description": "Action when the address appears in many known data breaches. `DECLINE` flips the final `status` to `Declined`; `NO_ACTION` records the signal without declining. Only takes effect when `enable_enrichment` is `true`." + }, "enable_social": { "type": "boolean", "default": false, @@ -16811,7 +18007,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — this API never returns `401`. Checks are free, so there is no credit check here.", + "description": "Permission denied. Returned when the `x-api-key` header is missing; a wrong, revoked or expired key returns `401`. Checks are free, so there is no credit check here.", "content": { "application/json": { "examples": { @@ -17032,14 +18228,39 @@ "source": "curl -X GET 'https://verification.didit.me/v3/workflows/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Accept: application/json'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import requests\n\nresp = requests.get(\n \"https://verification.didit.me/v3/workflows/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n timeout=10,\n)\nresp.raise_for_status()\npage = resp.json()\nfor workflow in page[\"results\"]:\n print(workflow[\"uuid\"], workflow[\"workflow_label\"], workflow[\"status\"])" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.workflows.list():\n print(item)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const res = await fetch(\"https://verification.didit.me/v3/workflows/\", {\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n});\nif (!res.ok) throw new Error(`Didit ${res.status}`);\nconst page = await res.json();\npage.results.forEach((w) => console.log(w.uuid, w.workflow_label, w.status));" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.workflows.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Workflows.ListAutoPaging(ctx, didit.WorkflowsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.workflows().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "workflows->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.workflows.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Workflows.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ] }, @@ -17172,10 +18393,28 @@ } }, "400": { - "description": "Validation error. Common causes: a top-level key outside the accepted whitelist (e.g. `workflow_type`), an unknown `feature` value, a feature placed before its dependency (e.g., `FACE_MATCH` before `OCR`), a passive feature (`AML`, `IP_ANALYSIS`, `DATABASE_VALIDATION`, `KYB_KEY_PEOPLE`) used as the first step, a `QUESTIONNAIRE` feature whose `config.questionnaire_uuid` does not exist for this application, or an out-of-range threshold. Body is a DRF validation error object — keys are field names, values are arrays of human-readable messages.", + "description": "Validation error. Common causes: a top-level key outside the accepted whitelist (e.g. `workflow_type`), an unknown `feature` value, a feature placed before its dependency (e.g., `FACE_MATCH` before `OCR`), a passive feature (`AML`, `IP_ANALYSIS`, `DATABASE_VALIDATION`, `KYB_KEY_PEOPLE`) used as the first step, a `QUESTIONNAIRE` feature whose `config.questionnaire_uuid` does not exist for this application, a `SIGNATURE` feature that would go live with no document to sign, a `SIGNATURE` feature at `signature_level: \"aes\"` while Advanced (AES) is not available (`aes_not_available`, see `signature_availability` on the workflow), or an out-of-range threshold. Body is a DRF validation error object — keys are field names, values are arrays of human-readable messages.", "content": { "application/json": { "examples": { + "Advanced (AES) not available": { + "value": { + "features": { + "signature_level": [ + "Node 'signature': Advanced (AES) is not available yet (aes_not_available)." + ] + } + } + }, + "Signature step with no document": { + "value": { + "features": { + "non_field_errors": [ + "Node 'signature': Add a document to sign, or let each session bring its own." + ] + } + } + }, "Missing feature": { "value": { "features": [ @@ -17249,14 +18488,39 @@ "source": "curl -X POST 'https://verification.didit.me/v3/workflows/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\n \"workflow_label\": \"Standard KYC\",\n \"features\": [\n {\"feature\": \"OCR\"},\n {\"feature\": \"LIVENESS\", \"config\": {\"face_liveness_method\": \"passive\"}},\n {\"feature\": \"FACE_MATCH\", \"config\": {\"face_match_score_decline_threshold\": 40, \"face_match_score_review_threshold\": 60}}\n ]\n }'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import requests\n\npayload = {\n \"workflow_label\": \"Standard KYC\",\n \"features\": [\n {\"feature\": \"OCR\"},\n {\"feature\": \"LIVENESS\", \"config\": {\"face_liveness_method\": \"passive\"}},\n {\"feature\": \"FACE_MATCH\"},\n ],\n}\nresp = requests.post(\n \"https://verification.didit.me/v3/workflows/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n json=payload,\n timeout=10,\n)\nresp.raise_for_status()\nworkflow = resp.json()\nprint(\"Workflow id:\", workflow[\"uuid\"])" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.workflows.create(\n workflow_label=\"Standard KYC\",\n features=[{\n \"feature\": \"OCR\",\n \"config\": {\"duplicated_user_action\": \"review\"},\n }, {\n \"feature\": \"LIVENESS\",\n \"config\": {\"face_liveness_method\": \"passive\"},\n }, {\n \"feature\": \"FACE_MATCH\",\n \"config\": {\"face_match_score_decline_threshold\": 40, \"face_match_score_review_threshold\": 60},\n }],\n)\nprint(result)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const res = await fetch(\"https://verification.didit.me/v3/workflows/\", {\n method: \"POST\",\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n workflow_label: \"Standard KYC\",\n features: [\n { feature: \"OCR\" },\n { feature: \"LIVENESS\", config: { face_liveness_method: \"passive\" } },\n { feature: \"FACE_MATCH\" },\n ],\n }),\n});\nif (!res.ok) throw new Error(`Didit ${res.status}: ${await res.text()}`);\nconst workflow = await res.json();\nconsole.log(\"Workflow id:\", workflow.uuid);" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.workflows.create({\n workflow_label: \"Standard KYC\",\n features: [{\n feature: \"OCR\",\n config: { duplicated_user_action: \"review\" },\n }, {\n feature: \"LIVENESS\",\n config: { face_liveness_method: \"passive\" },\n }, {\n feature: \"FACE_MATCH\",\n config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },\n }],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Workflows.Create(ctx, didit.SimpleWorkflowRequest{\n\tWorkflowLabel: didit.String(\"Standard KYC\"),\n\tFeatures: []didit.SimpleWorkflowFeature{{\n\t\tFeature: \"OCR\",\n\t\tConfig: didit.Some(map[string]any{\"duplicated_user_action\": \"review\"}),\n\t}, {\n\t\tFeature: \"LIVENESS\",\n\t\tConfig: didit.Some(map[string]any{\"face_liveness_method\": \"passive\"}),\n\t}, {\n\t\tFeature: \"FACE_MATCH\",\n\t\tConfig: didit.Some(map[string]any{\"face_match_score_decline_threshold\": 40, \"face_match_score_review_threshold\": 60}),\n\t}},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SimpleWorkflowFeature;\nimport me.didit.types.SimpleWorkflowRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.workflows().create(SimpleWorkflowRequest.builder()\n .workflowLabel(\"Standard KYC\")\n .features(List.of(\n SimpleWorkflowFeature.builder()\n .feature(SimpleWorkflowFeature.Feature.of(\"OCR\"))\n .config(Map.of(\"duplicated_user_action\", \"review\"))\n .build(),\n SimpleWorkflowFeature.builder()\n .feature(SimpleWorkflowFeature.Feature.of(\"LIVENESS\"))\n .config(Map.of(\"face_liveness_method\", \"passive\"))\n .build(),\n SimpleWorkflowFeature.builder()\n .feature(SimpleWorkflowFeature.Feature.of(\"FACE_MATCH\"))\n .config(Map.of(\"face_match_score_decline_threshold\", 40, \"face_match_score_review_threshold\", 60))\n .build()))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "workflows->create([\n 'workflow_label' => 'Standard KYC',\n 'features' => [[\n 'feature' => 'OCR',\n 'config' => ['duplicated_user_action' => 'review'],\n ], [\n 'feature' => 'LIVENESS',\n 'config' => ['face_liveness_method' => 'passive'],\n ], [\n 'feature' => 'FACE_MATCH',\n 'config' => ['face_match_score_decline_threshold' => 40, 'face_match_score_review_threshold' => 60],\n ]],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.workflows.create(\n workflow_label: \"Standard KYC\",\n features: [{\n feature: \"OCR\",\n config: { duplicated_user_action: \"review\" },\n }, {\n feature: \"LIVENESS\",\n config: { face_liveness_method: \"passive\" },\n }, {\n feature: \"FACE_MATCH\",\n config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },\n }]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Workflows.CreateAsync(new SimpleWorkflowRequest\n{\n WorkflowLabel = \"Standard KYC\",\n Features = new SimpleWorkflowFeature[]\n {\n new()\n {\n Feature = \"OCR\",\n Config = new Dictionary { [\"duplicated_user_action\"] = \"review\" },\n },\n new()\n {\n Feature = \"LIVENESS\",\n Config = new Dictionary { [\"face_liveness_method\"] = \"passive\" },\n },\n new()\n {\n Feature = \"FACE_MATCH\",\n Config = new Dictionary { [\"face_match_score_decline_threshold\"] = 40, [\"face_match_score_review_threshold\"] = 60 },\n },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -17400,14 +18664,39 @@ "source": "curl -X GET 'https://verification.didit.me/v3/workflows/a1b2c3d4-5678-90ab-cdef-111111111111/' \\\n -H 'x-api-key: YOUR_API_KEY'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import requests\n\nresp = requests.get(\n f\"https://verification.didit.me/v3/workflows/{settings_uuid}/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n timeout=10,\n)\nresp.raise_for_status()\nworkflow = resp.json()\nprint(workflow[\"workflow_label\"], workflow[\"status\"])" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.workflows.retrieve(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const res = await fetch(`https://verification.didit.me/v3/workflows/${settingsUuid}/`, {\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n});\nif (!res.ok) throw new Error(`Didit ${res.status}`);\nconst workflow = await res.json();\nconsole.log(workflow.workflow_label, workflow.status);" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.workflows.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Workflows.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.workflows().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "workflows->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.workflows.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Workflows.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] }, @@ -17507,7 +18796,7 @@ } }, "400": { - "description": "Validation error — a top-level key outside the accepted whitelist, an unknown feature, invalid ordering, out-of-range threshold, referencing a non-existent questionnaire, or `status: \"draft\"` sent for a published version (`\"Cannot revert a published version to draft.\"`). The response body is a DRF validation error keyed by field name." + "description": "Validation error — a top-level key outside the accepted whitelist, an unknown feature, invalid ordering, out-of-range threshold, referencing a non-existent questionnaire, a `SIGNATURE` feature that would go live with no document to sign, a new `SIGNATURE` feature at `signature_level: \"aes\"` while Advanced (AES) is not available (`aes_not_available`, see `signature_availability` on the workflow; a step that already stores `aes` keeps it), or `status: \"draft\"` sent for a published version (`\"Cannot revert a published version to draft.\"`). The response body is a DRF validation error keyed by field name." }, "403": { "description": "API key missing or invalid.", @@ -17548,14 +18837,39 @@ "source": "curl -X PATCH 'https://verification.didit.me/v3/workflows/a1b2c3d4-5678-90ab-cdef-111111111111/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"workflow_label\": \"Premium KYC\"}'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import requests\n\nresp = requests.patch(\n f\"https://verification.didit.me/v3/workflows/{settings_uuid}/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n json={\"workflow_label\": \"Premium KYC\"},\n timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json()[\"workflow_label\"])" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.workflows.update(\n \"11111111-2222-3333-4444-555555555555\",\n features=[{\n \"feature\": \"OCR\",\n }, {\n \"feature\": \"AML\",\n }],\n)\nprint(result)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const res = await fetch(`https://verification.didit.me/v3/workflows/${settingsUuid}/`, {\n method: \"PATCH\",\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ workflow_label: \"Premium KYC\" }),\n});\nif (!res.ok) throw new Error(`Didit ${res.status}`);\nconst workflow = await res.json();\nconsole.log(workflow.workflow_label);" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.workflows.update(\"11111111-2222-3333-4444-555555555555\", {\n features: [{\n feature: \"OCR\",\n }, {\n feature: \"AML\",\n }],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Workflows.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SimpleWorkflowUpdateRequest{\n\tFeatures: didit.Some([]didit.SimpleWorkflowFeature{{\n\t\tFeature: \"OCR\",\n\t}, {\n\t\tFeature: \"AML\",\n\t}}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.SimpleWorkflowFeature;\nimport me.didit.types.SimpleWorkflowUpdateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.workflows().update(\"11111111-2222-3333-4444-555555555555\", SimpleWorkflowUpdateRequest.builder()\n .features(List.of(\n SimpleWorkflowFeature.builder()\n .feature(SimpleWorkflowFeature.Feature.of(\"OCR\"))\n .build(),\n SimpleWorkflowFeature.builder()\n .feature(SimpleWorkflowFeature.Feature.of(\"AML\"))\n .build()))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "workflows->update('11111111-2222-3333-4444-555555555555', [\n 'features' => [[\n 'feature' => 'OCR',\n ], [\n 'feature' => 'AML',\n ]],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.workflows.update(\n \"11111111-2222-3333-4444-555555555555\",\n features: [{\n feature: \"OCR\",\n }, {\n feature: \"AML\",\n }]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Workflows.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new SimpleWorkflowUpdateRequest\n{\n Features = new SimpleWorkflowFeature[]\n {\n new()\n {\n Feature = \"OCR\",\n },\n new()\n {\n Feature = \"AML\",\n },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] }, @@ -17635,14 +18949,39 @@ "source": "curl -X DELETE 'https://verification.didit.me/v3/workflows/a1b2c3d4-5678-90ab-cdef-111111111111/' \\\n -H 'x-api-key: YOUR_API_KEY'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import requests\n\nresp = requests.delete(\n f\"https://verification.didit.me/v3/workflows/{settings_uuid}/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n timeout=10,\n)\nresp.raise_for_status() # raises on 4xx/5xx; 204 is success" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.workflows.delete(\n \"11111111-2222-3333-4444-555555555555\",\n)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const res = await fetch(`https://verification.didit.me/v3/workflows/${settingsUuid}/`, {\n method: \"DELETE\",\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n});\nif (res.status !== 204) throw new Error(`Didit ${res.status}`);" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.workflows.delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Workflows.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.workflows().delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "workflows->delete('11111111-2222-3333-4444-555555555555');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.workflows.delete(\"11111111-2222-3333-4444-555555555555\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Workflows.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");" } ] } @@ -17788,14 +19127,39 @@ "source": "curl -X GET 'https://verification.didit.me/v3/questionnaires/' \\\n -H 'x-api-key: YOUR_API_KEY'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import requests\n\nresp = requests.get(\n \"https://verification.didit.me/v3/questionnaires/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n timeout=10,\n)\nresp.raise_for_status()\npage = resp.json()\nfor q in page[\"results\"]:\n print(q[\"uuid\"], q[\"title\"], q[\"status\"])" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.questionnaires.list():\n print(item)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const res = await fetch(\"https://verification.didit.me/v3/questionnaires/\", {\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n});\nif (!res.ok) throw new Error(`Didit ${res.status}`);\nconst page = await res.json();\npage.results.forEach((q) => console.log(q.uuid, q.title, q.status));" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.questionnaires.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Questionnaires.ListAutoPaging(ctx, didit.QuestionnairesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.questionnaires().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "questionnaires->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.questionnaires.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Questionnaires.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ] }, @@ -18011,14 +19375,39 @@ "source": "curl -X POST 'https://verification.didit.me/v3/questionnaires/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\n \"title\": \"Customer Onboarding\",\n \"default_language\": \"en\",\n \"languages\": [\"en\"],\n \"form_elements\": [\n {\n \"id\": \"occupation\",\n \"element_type\": \"short_text\",\n \"label\": {\"en\": \"What is your occupation?\"},\n \"is_required\": true\n }\n ]\n }'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import requests\n\npayload = {\n \"title\": \"Customer Onboarding\",\n \"default_language\": \"en\",\n \"languages\": [\"en\"],\n \"form_elements\": [\n {\n \"id\": \"occupation\",\n \"element_type\": \"short_text\",\n \"label\": {\"en\": \"What is your occupation?\"},\n \"is_required\": True,\n },\n ],\n}\nresp = requests.post(\n \"https://verification.didit.me/v3/questionnaires/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n json=payload,\n timeout=10,\n)\nresp.raise_for_status()\nquestionnaire = resp.json()\nprint(\"Questionnaire id:\", questionnaire[\"questionnaire_id\"])" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.questionnaires.create(\n title=\"Customer Onboarding\",\n description=\"Additional information needed for verification\",\n languages=[\"en\"],\n default_language=\"en\",\n is_active=True,\n form_elements=[{\n \"id\": \"occupation\",\n \"element_type\": \"short_text\",\n \"label\": {\"en\": \"What is your occupation?\"},\n \"placeholder\": {\"en\": \"Software engineer\"},\n \"is_required\": True,\n }, {\n \"id\": \"source_of_funds\",\n \"element_type\": \"multiple_choice\",\n \"label\": {\"en\": \"Source of funds\"},\n \"is_required\": True,\n \"options\": [{\n \"value\": \"employment\",\n \"label\": {\"en\": \"Employment\"},\n }, {\n \"value\": \"business\",\n \"label\": {\"en\": \"Business\"},\n }, {\n \"value\": \"investments\",\n \"label\": {\"en\": \"Investments\"},\n }, {\n \"value\": \"other\",\n \"label\": {\"en\": \"Other\"},\n }],\n }],\n)\nprint(result)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const res = await fetch(\"https://verification.didit.me/v3/questionnaires/\", {\n method: \"POST\",\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n title: \"Customer Onboarding\",\n default_language: \"en\",\n languages: [\"en\"],\n form_elements: [\n {\n id: \"occupation\",\n element_type: \"short_text\",\n label: { en: \"What is your occupation?\" },\n is_required: true,\n },\n ],\n }),\n});\nif (!res.ok) throw new Error(`Didit ${res.status}: ${await res.text()}`);\nconst questionnaire = await res.json();\nconsole.log(\"Questionnaire id:\", questionnaire.questionnaire_id);" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.questionnaires.create({\n title: \"Customer Onboarding\",\n description: \"Additional information needed for verification\",\n languages: [\"en\"],\n default_language: \"en\",\n is_active: true,\n form_elements: [{\n id: \"occupation\",\n element_type: \"short_text\",\n label: { en: \"What is your occupation?\" },\n placeholder: { en: \"Software engineer\" },\n is_required: true,\n }, {\n id: \"source_of_funds\",\n element_type: \"multiple_choice\",\n label: { en: \"Source of funds\" },\n is_required: true,\n options: [{\n value: \"employment\",\n label: { en: \"Employment\" },\n }, {\n value: \"business\",\n label: { en: \"Business\" },\n }, {\n value: \"investments\",\n label: { en: \"Investments\" },\n }, {\n value: \"other\",\n label: { en: \"Other\" },\n }],\n }],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Questionnaires.Create(ctx, didit.SimpleQuestionnaireRequest{\n\tTitle: \"Customer Onboarding\",\n\tDescription: didit.String(\"Additional information needed for verification\"),\n\tLanguages: []string{\"en\"},\n\tDefaultLanguage: didit.String(\"en\"),\n\tIsActive: didit.Bool(true),\n\tFormElements: []didit.SimpleQuestionnaireElement{{\n\t\tID: didit.String(\"occupation\"),\n\t\tElementType: \"short_text\",\n\t\tLabel: map[string]string{\"en\": \"What is your occupation?\"},\n\t\tPlaceholder: didit.Some(map[string]string{\"en\": \"Software engineer\"}),\n\t\tIsRequired: didit.Bool(true),\n\t}, {\n\t\tID: didit.String(\"source_of_funds\"),\n\t\tElementType: \"multiple_choice\",\n\t\tLabel: map[string]string{\"en\": \"Source of funds\"},\n\t\tIsRequired: didit.Bool(true),\n\t\tOptions: didit.Some([]didit.SimpleQuestionnaireElementOptions{{\n\t\t\tValue: didit.String(\"employment\"),\n\t\t\tLabel: map[string]string{\"en\": \"Employment\"},\n\t\t}, {\n\t\t\tValue: didit.String(\"business\"),\n\t\t\tLabel: map[string]string{\"en\": \"Business\"},\n\t\t}, {\n\t\t\tValue: didit.String(\"investments\"),\n\t\t\tLabel: map[string]string{\"en\": \"Investments\"},\n\t\t}, {\n\t\t\tValue: didit.String(\"other\"),\n\t\t\tLabel: map[string]string{\"en\": \"Other\"},\n\t\t}}),\n\t}},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SimpleQuestionnaireElement;\nimport me.didit.types.SimpleQuestionnaireRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.questionnaires().create(SimpleQuestionnaireRequest.builder()\n .title(\"Customer Onboarding\")\n .description(\"Additional information needed for verification\")\n .languages(List.of(\"en\"))\n .defaultLanguage(\"en\")\n .isActive(true)\n .formElements(List.of(\n SimpleQuestionnaireElement.builder()\n .id(\"occupation\")\n .elementType(SimpleQuestionnaireElement.ElementType.of(\"short_text\"))\n .label(Map.of(\"en\", \"What is your occupation?\"))\n .placeholder(Map.of(\"en\", \"Software engineer\"))\n .isRequired(true)\n .build(),\n SimpleQuestionnaireElement.builder()\n .id(\"source_of_funds\")\n .elementType(SimpleQuestionnaireElement.ElementType.of(\"multiple_choice\"))\n .label(Map.of(\"en\", \"Source of funds\"))\n .isRequired(true)\n .options(List.of(\n SimpleQuestionnaireElement.Options.builder()\n .value(\"employment\")\n .label(Map.of(\"en\", \"Employment\"))\n .build(),\n SimpleQuestionnaireElement.Options.builder()\n .value(\"business\")\n .label(Map.of(\"en\", \"Business\"))\n .build(),\n SimpleQuestionnaireElement.Options.builder()\n .value(\"investments\")\n .label(Map.of(\"en\", \"Investments\"))\n .build(),\n SimpleQuestionnaireElement.Options.builder()\n .value(\"other\")\n .label(Map.of(\"en\", \"Other\"))\n .build()))\n .build()))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "questionnaires->create([\n 'title' => 'Customer Onboarding',\n 'description' => 'Additional information needed for verification',\n 'languages' => ['en'],\n 'default_language' => 'en',\n 'is_active' => true,\n 'form_elements' => [[\n 'id' => 'occupation',\n 'element_type' => 'short_text',\n 'label' => ['en' => 'What is your occupation?'],\n 'placeholder' => ['en' => 'Software engineer'],\n 'is_required' => true,\n ], [\n 'id' => 'source_of_funds',\n 'element_type' => 'multiple_choice',\n 'label' => ['en' => 'Source of funds'],\n 'is_required' => true,\n 'options' => [[\n 'value' => 'employment',\n 'label' => ['en' => 'Employment'],\n ], [\n 'value' => 'business',\n 'label' => ['en' => 'Business'],\n ], [\n 'value' => 'investments',\n 'label' => ['en' => 'Investments'],\n ], [\n 'value' => 'other',\n 'label' => ['en' => 'Other'],\n ]],\n ]],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.questionnaires.create(\n title: \"Customer Onboarding\",\n description: \"Additional information needed for verification\",\n languages: [\"en\"],\n default_language: \"en\",\n is_active: true,\n form_elements: [{\n id: \"occupation\",\n element_type: \"short_text\",\n label: { en: \"What is your occupation?\" },\n placeholder: { en: \"Software engineer\" },\n is_required: true,\n }, {\n id: \"source_of_funds\",\n element_type: \"multiple_choice\",\n label: { en: \"Source of funds\" },\n is_required: true,\n options: [{\n value: \"employment\",\n label: { en: \"Employment\" },\n }, {\n value: \"business\",\n label: { en: \"Business\" },\n }, {\n value: \"investments\",\n label: { en: \"Investments\" },\n }, {\n value: \"other\",\n label: { en: \"Other\" },\n }],\n }]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Questionnaires.CreateAsync(new SimpleQuestionnaireRequest\n{\n Title = \"Customer Onboarding\",\n Description = \"Additional information needed for verification\",\n Languages = new string[] { \"en\" },\n DefaultLanguage = \"en\",\n IsActive = true,\n FormElements = new SimpleQuestionnaireElement[]\n {\n new()\n {\n Id = \"occupation\",\n ElementType = \"short_text\",\n Label = new Dictionary { [\"en\"] = \"What is your occupation?\" },\n Placeholder = new Dictionary { [\"en\"] = \"Software engineer\" },\n IsRequired = true,\n },\n new()\n {\n Id = \"source_of_funds\",\n ElementType = \"multiple_choice\",\n Label = new Dictionary { [\"en\"] = \"Source of funds\" },\n IsRequired = true,\n Options = new SimpleQuestionnaireElementOptions[]\n {\n new()\n {\n Value = \"employment\",\n Label = new Dictionary { [\"en\"] = \"Employment\" },\n },\n new()\n {\n Value = \"business\",\n Label = new Dictionary { [\"en\"] = \"Business\" },\n },\n new()\n {\n Value = \"investments\",\n Label = new Dictionary { [\"en\"] = \"Investments\" },\n },\n new()\n {\n Value = \"other\",\n Label = new Dictionary { [\"en\"] = \"Other\" },\n },\n },\n },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -18179,14 +19568,39 @@ "source": "curl -X GET 'https://verification.didit.me/v3/questionnaires/11111111-2222-3333-4444-555555555555/' \\\n -H 'x-api-key: YOUR_API_KEY'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import requests\n\nresp = requests.get(\n f\"https://verification.didit.me/v3/questionnaires/{questionnaire_uuid}/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n timeout=10,\n)\nresp.raise_for_status()\nquestionnaire = resp.json()\nprint(questionnaire[\"title\"], questionnaire[\"status\"])" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.questionnaires.retrieve(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const res = await fetch(`https://verification.didit.me/v3/questionnaires/${questionnaireUuid}/`, {\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n});\nif (!res.ok) throw new Error(`Didit ${res.status}`);\nconst questionnaire = await res.json();\nconsole.log(questionnaire.title, questionnaire.status);" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.questionnaires.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Questionnaires.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.questionnaires().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "questionnaires->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.questionnaires.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Questionnaires.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] }, @@ -18322,14 +19736,39 @@ "source": "curl -X PATCH 'https://verification.didit.me/v3/questionnaires/11111111-2222-3333-4444-555555555555/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"title\": \"Updated Customer Onboarding\"}'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import requests\n\nresp = requests.patch(\n f\"https://verification.didit.me/v3/questionnaires/{questionnaire_uuid}/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n json={\"title\": \"Updated Customer Onboarding\"},\n timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json()[\"questionnaire_id\"], resp.json()[\"status\"])" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.questionnaires.update(\n \"11111111-2222-3333-4444-555555555555\",\n title=\"Updated Customer Onboarding\",\n)\nprint(result)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const res = await fetch(`https://verification.didit.me/v3/questionnaires/${questionnaireUuid}/`, {\n method: \"PATCH\",\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ title: \"Updated Customer Onboarding\" }),\n});\nif (!res.ok) throw new Error(`Didit ${res.status}`);\nconst q = await res.json();\nconsole.log(q.questionnaire_id, q.status);" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.questionnaires.update(\"11111111-2222-3333-4444-555555555555\", {\n title: \"Updated Customer Onboarding\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Questionnaires.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SimpleQuestionnaireUpdateRequest{\n\tTitle: didit.String(\"Updated Customer Onboarding\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SimpleQuestionnaireUpdateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.questionnaires().update(\"11111111-2222-3333-4444-555555555555\", SimpleQuestionnaireUpdateRequest.builder()\n .title(\"Updated Customer Onboarding\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "questionnaires->update('11111111-2222-3333-4444-555555555555', [\n 'title' => 'Updated Customer Onboarding',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.questionnaires.update(\n \"11111111-2222-3333-4444-555555555555\",\n title: \"Updated Customer Onboarding\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Questionnaires.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new SimpleQuestionnaireUpdateRequest\n{\n Title = \"Updated Customer Onboarding\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] }, @@ -18409,14 +19848,39 @@ "source": "curl -X DELETE 'https://verification.didit.me/v3/questionnaires/11111111-2222-3333-4444-555555555555/' \\\n -H 'x-api-key: YOUR_API_KEY'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import requests\n\nresp = requests.delete(\n f\"https://verification.didit.me/v3/questionnaires/{questionnaire_uuid}/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n timeout=10,\n)\nresp.raise_for_status() # raises on 4xx/5xx; 204 is success" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.questionnaires.delete(\n \"11111111-2222-3333-4444-555555555555\",\n)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const res = await fetch(`https://verification.didit.me/v3/questionnaires/${questionnaireUuid}/`, {\n method: \"DELETE\",\n headers: { 'x-api-key': 'YOUR_API_KEY' },\n});\nif (res.status !== 204) throw new Error(`Didit ${res.status}`);" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.questionnaires.delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Questionnaires.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.questionnaires().delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "questionnaires->delete('11111111-2222-3333-4444-555555555555');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.questionnaires.delete(\"11111111-2222-3333-4444-555555555555\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Questionnaires.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");" } ] } @@ -18442,7 +19906,8 @@ "schema": { "type": "integer", "default": 50, - "minimum": 1 + "minimum": 1, + "maximum": 1000000 }, "description": "Page size. Defaults to 50 when omitted. There is no enforced maximum, but keep pages small for latency." }, @@ -18452,7 +19917,8 @@ "schema": { "type": "integer", "default": 0, - "minimum": 0 + "minimum": 0, + "maximum": 1000000 }, "description": "Zero-based offset of the first record to return. Prefer following the `next` URL from the previous page over computing this by hand." } @@ -18466,12 +19932,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/users/',\n headers={'x-api-key': 'YOUR_API_KEY'},\n params={'limit': 50},\n)\nresp.raise_for_status()\npage = resp.json()\nfor user in page['results']:\n print(user['vendor_data'], user['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.users.list():\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const url = new URL('https://verification.didit.me/v3/users/');\nurl.searchParams.set('limit', '50');\n\nconst page = await fetch(url, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n}).then((r) => r.json());\n\nconsole.log(page.count, page.results.length);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.users.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Users.ListAutoPaging(ctx, didit.UsersListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.users().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.users.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Users.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -18622,7 +20113,7 @@ } }, "403": { - "description": "Invalid or revoked API key, or the key cannot list users for this application. Note: on this endpoint an *invalid* key returns `403` (not `401`).", + "description": "The key cannot list users for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -18692,12 +20183,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/users/user-abc-123/',\n headers={'x-api-key': 'YOUR_API_KEY'},\n)\nresp.raise_for_status()\nuser = resp.json()\nprint(user['didit_internal_id'], user['status'], user['session_count'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.retrieve(\n \"user-abc-123\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const vendorData = encodeURIComponent('user-abc-123');\nconst user = await fetch(\n `https://verification.didit.me/v3/users/${vendorData}/`,\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n).then((r) => r.json());\n\nconsole.log(user.didit_internal_id, user.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.retrieve(\"user-abc-123\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.Retrieve(ctx, \"user-abc-123\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().retrieve(\"user-abc-123\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->retrieve('user-abc-123');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.retrieve(\"user-abc-123\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.RetrieveAsync(\"user-abc-123\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -18820,7 +20336,7 @@ } }, "403": { - "description": "Invalid or revoked API key, or the key cannot read this application's users. Note: on this endpoint an *invalid* key returns `403` (not `401`).", + "description": "Invalid or revoked API key, or the key cannot read this application's users. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -18902,12 +20418,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.patch(\n 'https://verification.didit.me/v3/users/user-abc-123/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={'display_name': 'Jane S.', 'status': 'FLAGGED'},\n)\nresp.raise_for_status()\nprint(resp.json()['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.update(\n \"user-abc-123\",\n display_name=\"Jane S.\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/users/user-abc-123/', {\n method: 'PATCH',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ display_name: 'Jane S.', status: 'FLAGGED' }),\n});\nconst user = await resp.json();\nconsole.log(user.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.update(\"user-abc-123\", {\n display_name: \"Jane S.\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.Update(ctx, \"user-abc-123\", didit.UsersUpdateParams{\n\tDisplayName: didit.String(\"Jane S.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.UsersUpdateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().update(\"user-abc-123\", UsersUpdateParams.builder()\n .displayName(\"Jane S.\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->update('user-abc-123', [\n 'display_name' => 'Jane S.',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.update(\n \"user-abc-123\",\n display_name: \"Jane S.\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.UpdateAsync(\"user-abc-123\", new UsersUpdateParams\n{\n DisplayName = \"Jane S.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -19043,7 +20584,7 @@ } }, "403": { - "description": "Invalid or revoked API key, or the key cannot update users for this application. Note: on this endpoint an *invalid* key returns `403` (not `401`).", + "description": "The key cannot update users for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -19391,12 +20932,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.get(\n \"https://verification.didit.me/v3/users/user-abc-123/generate-pdf/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n stream=True,\n timeout=120,\n)\nresponse.raise_for_status()\nwith open(\"user-history.pdf\", \"wb\") as fh:\n for chunk in response.iter_content(chunk_size=8192):\n fh.write(chunk)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.users.generate_pdf(\n \"user-abc-123\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n file.write(content)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import { writeFile } from 'node:fs/promises';\n\nconst vendorData = encodeURIComponent('user-abc-123');\nconst response = await fetch(\n `https://verification.didit.me/v3/users/${vendorData}/generate-pdf/`,\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n);\nif (!response.ok) throw new Error(`PDF generation failed: HTTP ${response.status}`);\nawait writeFile('user-history.pdf', Buffer.from(await response.arrayBuffer()));" + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.users.generatePdf(\"user-abc-123\");\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Users.GeneratePDF(ctx, \"user-abc-123\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.users().generatePdf(\"user-abc-123\")\n .writeTo(Path.of(\"download.pdf\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->generatePdf('user-abc-123');\n$content->saveTo('download.pdf');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.users.generate_pdf(\"user-abc-123\")\nFile.binwrite(\"download.pdf\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Users.GeneratePdfAsync(\"user-abc-123\");\nawait content.SaveToAsync(\"download.pdf\");" } ] } @@ -19404,7 +20970,7 @@ "/v3/users/delete/": { "post": { "summary": "Batch delete users", - "description": "**Permanently delete** users: the user records are removed permanently. For everyday blocking prefer [Update User Status](#patch-/v3/users/-vendor_data-/update-status/) with `BLOCKED`. Select users with `vendor_data_list`, with `didit_internal_id_list`, or with both at once; or pass `delete_all: true`. This endpoint never narrows `delete_all` with filters. The Console's People filters are refused with a `400` (see the `400` response), so a narrowed intent does not turn into a full wipe. Two exceptions: `filter_has_approved_sessions` and `filter_has_declined_sessions` are not refused and not applied, so with `delete_all: true` they still delete every user; do not send them.\n\n**Biometric templates:** every image-free biometric template retained for these users after session deletion (see `/v3/biometric-templates/`) is purged before the user is deleted, so the person stops matching in duplicate detection and Face Search. If a template cannot be purged because a biometric store is unavailable, the call returns `503`, no user in the request is deleted, and repeating the request finishes the job.\n\n**Filed regulatory reports:** if the selected data is in a finalized regulatory report, the whole request is refused with `409` and nothing is deleted. The body uses `code: in_filed_report` and names each report with `uuid`, `report_number`, `report_type` and `case_uuid`. Delete the reports, then repeat the request.", + "description": "**Permanently delete** users: the user records are removed permanently. For everyday blocking prefer [Update User Status](#patch-/v3/users/-vendor_data-/update-status/) with `BLOCKED`. Select users with `vendor_data_list`, with `didit_internal_id_list`, or with both at once; or pass `delete_all: true`. This endpoint never narrows `delete_all` with filters. The Console's People filters are refused with a `400` (see the `400` response), so a narrowed intent does not turn into a full wipe. Two exceptions: `filter_has_approved_sessions` and `filter_has_declined_sessions` are not refused and not applied, so with `delete_all: true` they still delete every user; do not send them.\n\n**Biometric templates:** unless you set `retain_face_embeddings` to `true`, every image-free biometric template retained for these users after session deletion (see `/v3/biometric-templates/`) is purged before the user is deleted, so the person stops matching in duplicate detection and Face Search. With `retain_face_embeddings: true` and `face_retention_days`, you choose to keep one image-free biometric template per person for that many days, and nothing else about the person is kept. If a template cannot be purged because a biometric store is unavailable, the call returns `503`, no user in the request is deleted, and repeating the request finishes the job.\n\n**Filed regulatory reports:** if the selected data is in a finalized regulatory report, the whole request is refused with `409` and nothing is deleted. The body uses `code: in_filed_report` and names each report with `uuid`, `report_number`, `report_type` and `case_uuid`. Delete the reports, then repeat the request.", "operationId": "batch_delete_users", "x-didit-sdk": { "resource": "users", @@ -19442,6 +21008,18 @@ "type": "boolean", "default": false, "description": "If `true`, deletes every user in the application." + }, + "retain_face_embeddings": { + "type": "boolean", + "default": false, + "description": "Your explicit choice to keep one image-free biometric template of each deleted person for duplicate detection, for `face_retention_days`. Everything else about the person is deleted. Omit it, or send `false`, to delete the templates with the users. When `true`, `face_retention_days` is required." + }, + "face_retention_days": { + "type": "integer", + "minimum": 1, + "maximum": 3650, + "description": "Number of days the image-free biometric template is kept when `retain_face_embeddings` is `true`. Required with it, and rejected without it with a `400` on `face_retention_days`.", + "example": 365 } } }, @@ -19468,6 +21046,16 @@ "value": { "delete_all": true } + }, + "Keep face templates": { + "summary": "Delete users and keep anonymous face templates for 365 days", + "value": { + "vendor_data_list": [ + "user-123" + ], + "retain_face_embeddings": true, + "face_retention_days": 365 + } } } } @@ -19482,12 +21070,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/users/delete/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={'vendor_data_list': ['user-123', 'user-456']},\n)\nresp.raise_for_status()\nprint('deleted', resp.json()['deleted'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.batch_delete(\n vendor_data_list=[\"user-123\", \"user-456\"],\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/users/delete/', {\n method: 'POST',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ vendor_data_list: ['user-123', 'user-456'] }),\n});\nconst body = await resp.json();\nconsole.log('deleted', body.deleted);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.batchDelete({\n vendor_data_list: [\"user-123\", \"user-456\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.BatchDelete(ctx, didit.UsersBatchDeleteParams{\n\tVendorDataList: didit.Some([]string{\"user-123\", \"user-456\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.UsersBatchDeleteParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().batchDelete(UsersBatchDeleteParams.builder()\n .vendorDataList(List.of(\"user-123\", \"user-456\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->batchDelete([\n 'vendor_data_list' => ['user-123', 'user-456'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.batch_delete(vendor_data_list: [\"user-123\", \"user-456\"])\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.BatchDeleteAsync(new UsersBatchDeleteParams\n{\n VendorDataList = new string[] { \"user-123\", \"user-456\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -19556,7 +21169,7 @@ } }, "403": { - "description": "Invalid or revoked API key, or the key cannot delete users for this application. Note: on this endpoint an *invalid* key returns `403` (not `401`).", + "description": "Invalid or revoked API key, or the key cannot delete users for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -20138,7 +21751,7 @@ } }, "403": { - "description": "Missing or invalid API key. This API returns `403` for authentication failures — never `401`.", + "description": "Missing API key. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "schema": { @@ -20203,12 +21816,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/sessions/delete/\",\n headers={\n \"x-api-key\": \"YOUR_API_KEY\",\n \"Content-Type\": \"application/json\",\n },\n json={\"session_numbers\": [\"1001\", \"1002\", \"1003\"]},\n)\nresponse.raise_for_status()\nif response.status_code == 202: # more than 20 sessions: poll the job\n job_id = response.json()[\"job_id\"]\nelse: # 200: one result per matched session\n print(response.json()[\"results\"])\n\n# Destructive: delete every KYC session in the application\n# requests.post(\n# \"https://verification.didit.me/v3/sessions/delete/\",\n# headers={\"x-api-key\": \"YOUR_API_KEY\"},\n# json={\"delete_all\": True},\n# )" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.batch_delete(\n session_numbers=[\"1001\", \"1002\", \"1003\"],\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const response = await fetch(\n 'https://verification.didit.me/v3/sessions/delete/',\n {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ session_numbers: ['1001', '1002', '1003'] }),\n },\n);\nif (response.status !== 200 && response.status !== 202) throw new Error(`HTTP ${response.status}`);\nconst body = await response.json();\n// 200: body.results, one per matched session. 202: poll /v3/sessions/delete/${body.job_id}/" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.batchDelete({\n session_numbers: [\"1001\", \"1002\", \"1003\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.BatchDelete(ctx, didit.SessionsBatchDeleteParams{\n\tSessionNumbers: didit.Some([]string{\"1001\", \"1002\", \"1003\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.SessionsBatchDeleteParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().batchDelete(SessionsBatchDeleteParams.builder()\n .sessionNumbers(List.of(\"1001\", \"1002\", \"1003\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->batchDelete([\n 'session_numbers' => ['1001', '1002', '1003'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.batch_delete(session_numbers: [\"1001\", \"1002\", \"1003\"])\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.BatchDeleteAsync(new SessionsBatchDeleteParams\n{\n SessionNumbers = new string[] { \"1001\", \"1002\", \"1003\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -20253,12 +21891,37 @@ { "lang": "python", "label": "Python", - "source": "import time\nimport requests\n\nurl = 'https://verification.didit.me/v3/sessions/delete/JOB_ID/'\nwhile True:\n job = requests.get(url, headers={'x-api-key': 'YOUR_API_KEY'}).json()\n if job['status'] in ('COMPLETED', 'FAILED'):\n break\n time.sleep(3)\nprint(job['status'], job['outcomes'], job['error'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.retrieve_deletion_job(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const url = 'https://verification.didit.me/v3/sessions/delete/JOB_ID/';\nlet job;\ndo {\n await new Promise((r) => setTimeout(r, 3000));\n job = await (await fetch(url, { headers: { 'x-api-key': 'YOUR_API_KEY' } })).json();\n} while (job.status === 'PENDING' || job.status === 'PROCESSING');\nconsole.log(job.status, job.outcomes, job.error);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.retrieveDeletionJob(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.RetrieveDeletionJob(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().retrieveDeletionJob(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->retrieveDeletionJob('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.retrieve_deletion_job(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.RetrieveDeletionJobAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -20335,7 +21998,7 @@ } }, "403": { - "description": "Missing or invalid API key. This API returns `403` for authentication failures, never `401`.", + "description": "Missing API key. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "schema": { @@ -20584,7 +22247,7 @@ } }, "403": { - "description": "Missing, malformed, expired, or revoked `x-api-key`. Authentication is checked before the session lookup, so an invalid key returns `403` even when the session UUID does not exist.", + "description": "Missing, malformed, expired, or revoked `x-api-key`. Authentication is checked before the session lookup, so a missing key returns `403` even when the session UUID does not exist.", "content": { "application/json": { "schema": { @@ -20647,14 +22310,39 @@ "source": "curl -s 'https://verification.didit.me/v3/sessions/8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d/reviews/?limit=50' \\\n -H 'x-api-key: YOUR_API_KEY'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import os, requests\n\nsession_id = \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\"\nurl = f\"https://verification.didit.me/v3/sessions/{session_id}/reviews/\"\n\nwhile url: # walk every page of the feed\n resp = requests.get(url, headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]}, timeout=10)\n resp.raise_for_status()\n page = resp.json()\n for entry in page[\"results\"]:\n print(entry[\"created_at\"], entry[\"activity_type\"], entry[\"actor_display\"], entry.get(\"new_status\"))\n url = page[\"next\"]" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.sessions.reviews.list(\n \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\",\n):\n print(item)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "const sessionId = \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\";\nconst res = await fetch(\n `https://verification.didit.me/v3/sessions/${sessionId}/reviews/`,\n { headers: { 'x-api-key': 'YOUR_API_KEY' } },\n);\nif (!res.ok) throw new Error(`Didit ${res.status}`);\nconst { count, results } = await res.json();\nconsole.log(`${count} feed entries`);\nfor (const entry of results) {\n console.log(entry.created_at, entry.activity_type, entry.actor_display, entry.new_status ?? \"\");\n}" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.sessions.reviews.list(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.Reviews.ListAutoPaging(ctx, \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\", didit.SessionsReviewsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.sessions().reviews().list(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->reviews->list('8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.reviews.list(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Sessions.Reviews.ListAsync(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ] }, @@ -20845,7 +22533,7 @@ } }, "403": { - "description": "Missing, malformed, expired, or revoked `x-api-key`. Authentication is checked before the session lookup, so an invalid key returns `403` even when the session UUID does not exist.", + "description": "Missing, malformed, expired, or revoked `x-api-key`. Authentication is checked before the session lookup, so a missing key returns `403` even when the session UUID does not exist.", "content": { "application/json": { "schema": { @@ -20908,14 +22596,39 @@ "source": "# Records an audit-trail note only -- the session's status does NOT change.\ncurl -s -X POST https://verification.didit.me/v3/sessions/8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d/reviews/ \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\n \"new_status\": \"In Review\",\n \"comment\": \"Flagging for manual document re-check.\"\n }'" }, { - "lang": "Python", - "label": "Python (requests)", - "source": "import os, requests\n\n# Records an audit-trail note only -- the session's status does NOT change.\n# To approve/decline a session use PATCH /v3/session/{session_id}/update-status/.\nsession_id = \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\"\nresp = requests.post(\n f\"https://verification.didit.me/v3/sessions/{session_id}/reviews/\",\n headers={\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Content-Type\": \"application/json\",\n },\n json={\n \"new_status\": \"In Review\",\n \"comment\": \"Flagging for manual document re-check.\",\n },\n timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json()) # {'user': 'Unknown', 'new_status': 'In Review', ...}" + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.reviews.create(\n \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\",\n new_status=\"In Review\",\n comment=\"Flagging for manual document re-check.\",\n)\nprint(result)" }, { - "lang": "JavaScript", - "label": "Node.js (fetch)", - "source": "// Records an audit-trail note only -- the session's status does NOT change.\n// To approve/decline a session use PATCH /v3/session/{session_id}/update-status/.\nconst sessionId = \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\";\nconst res = await fetch(\n `https://verification.didit.me/v3/sessions/${sessionId}/reviews/`,\n {\n method: \"POST\",\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n new_status: \"In Review\",\n comment: \"Flagging for manual document re-check.\",\n }),\n },\n);\nif (!res.ok) throw new Error(`Didit ${res.status}: ${await res.text()}`);\nconsole.log(await res.json()); // { user: 'Unknown', new_status: 'In Review', ... }" + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.reviews.create(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\", {\n new_status: \"In Review\",\n comment: \"Flagging for manual document re-check.\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Reviews.Create(ctx, \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\", didit.SessionsReviewsCreateParams{\n\tNewStatus: didit.Some(didit.SessionsReviewsCreateParamsNewStatus(\"In Review\")),\n\tComment: didit.String(\"Flagging for manual document re-check.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsReviewsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().reviews().create(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\", SessionsReviewsCreateParams.builder()\n .newStatus(SessionsReviewsCreateParams.NewStatus.of(\"In Review\"))\n .comment(\"Flagging for manual document re-check.\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->reviews->create('8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d', [\n 'new_status' => 'In Review',\n 'comment' => 'Flagging for manual document re-check.',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.reviews.create(\n \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\",\n new_status: \"In Review\",\n comment: \"Flagging for manual document re-check.\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Reviews.CreateAsync(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\", new SessionsReviewsCreateParams\n{\n NewStatus = new SessionsReviewsCreateParamsNewStatus(\"In Review\"),\n Comment = \"Flagging for manual document re-check.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -20943,12 +22656,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nfrom decimal import Decimal\n\nimport requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/billing/balance/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\ndata = resp.json()\nbalance = Decimal(data['balance'])\nif balance < Decimal('50'):\n print(f'Low balance: ${balance} - top up before launching new sessions.')\nelse:\n print(f'Balance OK: ${balance}')" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.billing.retrieve_balance()\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/billing/balance/', {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Billing balance failed: ${resp.status}`);\nconst { balance, auto_refill_enabled, auto_refill_threshold } = await resp.json();\nconsole.log({ balance, auto_refill_enabled, auto_refill_threshold });" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.billing.retrieveBalance();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Billing.RetrieveBalance(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.billing().retrieveBalance();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "billing->retrieveBalance();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.billing.retrieve_balance\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Billing.RetrieveBalanceAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -21005,7 +22743,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot read billing data for this organization. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot read billing data for this organization. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -21108,12 +22846,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/billing/top-up/',\n headers={\n 'x-api-key': os.environ['DIDIT_API_KEY'],\n 'Content-Type': 'application/json',\n },\n json={\n 'amount_in_dollars': 500,\n 'success_url': 'https://yourapp.com/billing/success',\n 'cancel_url': 'https://yourapp.com/billing/cancel',\n },\n timeout=10,\n)\nresp.raise_for_status()\nsession = resp.json()\nprint('Redirect customer to:', session['checkout_session_url'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.billing.top_up(\n amount_in_dollars=50.0,\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/billing/top-up/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n amount_in_dollars: 500,\n success_url: 'https://yourapp.com/billing/success',\n cancel_url: 'https://yourapp.com/billing/cancel',\n }),\n});\nif (!resp.ok) throw new Error(`Top-up failed: ${resp.status}`);\nconst { checkout_session_url } = await resp.json();\nwindow.location.assign(checkout_session_url);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.billing.topUp({\n amount_in_dollars: 50.0,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Billing.TopUp(ctx, didit.BillingTopUpParams{\n\tAmountInDollars: 50.0,\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.BillingTopUpParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.billing().topUp(BillingTopUpParams.builder()\n .amountInDollars(50.0)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "billing->topUp([\n 'amount_in_dollars' => 50.0,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.billing.top_up(amount_in_dollars: 50.0)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Billing.TopUpAsync(new BillingTopUpParams\n{\n AmountInDollars = 50.0,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -21185,7 +22948,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot create top-up sessions for this organization. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot create top-up sessions for this organization. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -21243,12 +23006,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/webhook/destinations/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nfor dest in resp.json():\n print(f\"{dest['label']:30s} {dest['url']:50s} {dest['health_status']}\")" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.list()\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/webhook/destinations/', {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nconst destinations = await resp.json();\nfor (const d of destinations) {\n console.log(d.label, d.url, d.health_status, `${d.error_rate_percentage}% errors`);\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.list();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.List(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().list();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->destinations->list();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.webhooks.destinations.list.each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.ListAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -21771,7 +23559,7 @@ } }, "403": { - "description": "API key missing, malformed, expired, or scoped to a different application. Didit returns 403 (never 401) for all authentication failures on this endpoint.", + "description": "API key missing, malformed, expired, or scoped to a different application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -21827,12 +23615,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/webhook/destinations/',\n headers={\n 'x-api-key': os.environ['DIDIT_API_KEY'],\n 'Content-Type': 'application/json',\n },\n json={\n 'label': 'Production session webhooks',\n 'url': 'https://yourapp.com/webhooks/didit',\n 'webhook_version': 'v3',\n 'subscribed_events': ['status.updated', 'data.updated'],\n },\n timeout=10,\n)\nresp.raise_for_status()\ndestination = resp.json()\n# Store secret_shared_key in your secret manager.\nprint('Destination UUID:', destination['uuid'])\nprint('Signing secret:', destination['secret_shared_key'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.create(\n label=\"Production session webhooks\",\n url=\"https://yourapp.com/webhooks/didit\",\n webhook_version=\"v3\",\n subscribed_events=[\"status.updated\", \"data.updated\"],\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/webhook/destinations/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n label: 'Production session webhooks',\n url: 'https://yourapp.com/webhooks/didit',\n webhook_version: 'v3',\n subscribed_events: ['status.updated', 'data.updated'],\n }),\n});\nif (!resp.ok) throw new Error(await resp.text());\nconst destination = await resp.json();\nconsole.log('Store this secret securely:', destination.secret_shared_key);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.create({\n label: \"Production session webhooks\",\n url: \"https://yourapp.com/webhooks/didit\",\n webhook_version: \"v3\",\n subscribed_events: [\"status.updated\", \"data.updated\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.Create(ctx, didit.WebhooksDestinationsCreateParams{\n\tLabel: \"Production session webhooks\",\n\tURL: \"https://yourapp.com/webhooks/didit\",\n\tWebhookVersion: didit.Some(didit.WebhooksDestinationsCreateParamsWebhookVersion(\"v3\")),\n\tSubscribedEvents: didit.Some([]didit.WebhookEvent{didit.WebhookEvent(\"status.updated\"), didit.WebhookEvent(\"data.updated\")}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.WebhookEvent;\nimport me.didit.types.WebhooksDestinationsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().create(WebhooksDestinationsCreateParams.builder()\n .label(\"Production session webhooks\")\n .url(\"https://yourapp.com/webhooks/didit\")\n .webhookVersion(WebhooksDestinationsCreateParams.WebhookVersion.of(\"v3\"))\n .subscribedEvents(List.of(WebhookEvent.of(\"status.updated\"), WebhookEvent.of(\"data.updated\")))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->destinations->create([\n 'label' => 'Production session webhooks',\n 'url' => 'https://yourapp.com/webhooks/didit',\n 'webhook_version' => 'v3',\n 'subscribed_events' => ['status.updated', 'data.updated'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.create(\n label: \"Production session webhooks\",\n url: \"https://yourapp.com/webhooks/didit\",\n webhook_version: \"v3\",\n subscribed_events: [\"status.updated\", \"data.updated\"]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.CreateAsync(new WebhooksDestinationsCreateParams\n{\n Label = \"Production session webhooks\",\n Url = \"https://yourapp.com/webhooks/didit\",\n WebhookVersion = new WebhooksDestinationsCreateParamsWebhookVersion(\"v3\"),\n SubscribedEvents = new WebhookEvent[] { \"status.updated\", \"data.updated\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -21854,7 +23667,8 @@ "url": { "type": "string", "format": "uri", - "description": "HTTPS URL that will receive `POST` requests. Must be unique among the application's destinations. Use a stable, hardened endpoint: Didit retries failed deliveries on a backoff schedule." + "description": "HTTPS URL that will receive `POST` requests. Must be unique among the application's destinations. Use a stable, hardened endpoint: Didit retries failed deliveries on a backoff schedule.", + "maxLength": 2000 }, "enabled": { "type": "boolean", @@ -22132,7 +23946,7 @@ } }, "403": { - "description": "API key missing, malformed, expired, or scoped to a different application. Didit returns 403 (never 401) for all authentication failures on this endpoint.", + "description": "API key missing, malformed, expired, or scoped to a different application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -22203,12 +24017,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nuuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.get(\n f'https://verification.didit.me/v3/webhook/destinations/{uuid}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json())" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.retrieve(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const uuid = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/webhook/destinations/${uuid}/`, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Lookup failed: ${resp.status}`);\nconst destination = await resp.json();\nconsole.log(destination);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->destinations->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -22388,7 +24227,7 @@ } }, "403": { - "description": "API key missing, malformed, expired, or scoped to a different application. Didit returns 403 (never 401) for all authentication failures on this endpoint.", + "description": "API key missing, malformed, expired, or scoped to a different application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -22531,12 +24370,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nuuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.patch(\n f'https://verification.didit.me/v3/webhook/destinations/{uuid}/',\n headers={\n 'x-api-key': os.environ['DIDIT_API_KEY'],\n 'Content-Type': 'application/json',\n },\n json={'enabled': False},\n timeout=10,\n)\nresp.raise_for_status()\nprint('Paused destination:', resp.json()['label'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.update(\n \"11111111-2222-3333-4444-555555555555\",\n enabled=False,\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const uuid = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/webhook/destinations/${uuid}/`, {\n method: 'PATCH',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ enabled: false }),\n});\nif (!resp.ok) throw new Error(await resp.text());\nconsole.log(await resp.json());" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.update(\"11111111-2222-3333-4444-555555555555\", {\n enabled: false,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.WebhooksDestinationsUpdateParams{\n\tEnabled: didit.Bool(false),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.WebhooksDestinationsUpdateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().update(\"11111111-2222-3333-4444-555555555555\", WebhooksDestinationsUpdateParams.builder()\n .enabled(false)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->destinations->update('11111111-2222-3333-4444-555555555555', [\n 'enabled' => false,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.update(\n \"11111111-2222-3333-4444-555555555555\",\n enabled: false\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new WebhooksDestinationsUpdateParams\n{\n Enabled = false,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -22738,7 +24602,7 @@ } }, "403": { - "description": "API key missing, malformed, expired, or scoped to a different application. Didit returns 403 (never 401) for all authentication failures on this endpoint.", + "description": "API key missing, malformed, expired, or scoped to a different application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -22821,12 +24685,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nuuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.delete(\n f'https://verification.didit.me/v3/webhook/destinations/{uuid}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nassert resp.status_code == 204" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.webhooks.destinations.delete(\n \"11111111-2222-3333-4444-555555555555\",\n)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const uuid = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/webhook/destinations/${uuid}/`, {\n method: 'DELETE',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (resp.status !== 204) throw new Error(`Delete failed: ${resp.status}`);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.webhooks.destinations.delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Webhooks.Destinations.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.webhooks().destinations().delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->destinations->delete('11111111-2222-3333-4444-555555555555');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.webhooks.destinations.delete(\"11111111-2222-3333-4444-555555555555\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Webhooks.Destinations.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");" } ], "responses": { @@ -22834,7 +24723,7 @@ "description": "Destination, signing secret and delivery log deleted permanently. No response body." }, "403": { - "description": "API key missing, malformed, expired, or scoped to a different application. Didit returns 403 (never 401) for all authentication failures on this endpoint.", + "description": "API key missing, malformed, expired, or scoped to a different application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -22909,8 +24798,7 @@ "schema": { "type": "object", "required": [ - "wallet_address", - "blockchain" + "wallet_address" ], "properties": { "wallet_address": { @@ -22920,7 +24808,7 @@ }, "blockchain": { "type": "string", - "description": "Network identifier. Managed screening supports BTC, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base), OP (Optimism), and ARB (Arbitrum One). USDT and USDC are legacy Ethereum aliases, not multi-network searches. Connected-provider coverage varies. LIGHTNING requires a supported connected provider. CELO (Celo), MODE (Mode) and PLUME (Plume) are screened through a connected TRM Labs account; managed screening answers 400 for them. Alias: `currency`.", + "description": "Optional network identifier. When omitted, the network is read from the address format: `bc1`, `1` and `3` addresses are Bitcoin (BTC), `T` addresses are Tron (TRX) and base58 public keys are Solana (SOL). A `0x` address is valid on every EVM network, so omitting `blockchain` for it answers 422 with the candidate networks in `candidate_chains`. Managed screening supports BTC, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base), OP (Optimism), ARB (Arbitrum One), AVAX (Avalanche C-Chain), ADA (Cardano), XLM (Stellar) and HBAR (Hedera). USDT and USDC are legacy Ethereum aliases, not multi-network searches. Connected-provider coverage varies. LIGHTNING requires a supported connected provider. CELO (Celo), MODE (Mode) and PLUME (Plume) are screened through a connected TRM Labs account; managed screening answers 400 for them. Alias: `currency`.", "enum": [ "BTC", "LIGHTNING", @@ -22938,6 +24826,10 @@ "BASE", "OP", "ARB", + "AVAX", + "ADA", + "XLM", + "HBAR", "CELO", "MODE", "PLUME" @@ -22955,6 +24847,10 @@ ] } } + }, + "example": { + "wallet_address": "0x94f1b9b64e2932f6a2db338f616844400cd58e8a", + "blockchain": "ETH" } } } @@ -22968,12 +24864,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/wallet-screening/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={\n 'wallet_address': '0x94f1b9b64e2932f6a2db338f616844400cd58e8a',\n 'blockchain': 'ETH',\n },\n timeout=20,\n)\nresp.raise_for_status()\nresult = resp.json()\nprint(result['risk_score'], result['severity'], result['sanctions_hit'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.wallet_screening.screen(\n wallet_address=\"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n blockchain=\"ETH\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const result = await fetch('https://verification.didit.me/v3/wallet-screening/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n wallet_address: '0x94f1b9b64e2932f6a2db338f616844400cd58e8a',\n blockchain: 'ETH',\n }),\n}).then((r) => r.json());\nconsole.log(result.risk_score, result.severity, result.sanctions_hit);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.walletScreening.screen({\n wallet_address: \"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n blockchain: \"ETH\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.WalletScreening.Screen(ctx, didit.WalletScreeningScreenParams{\n\tWalletAddress: \"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n\tBlockchain: didit.Some(didit.WalletScreeningScreenParamsBlockchain(\"ETH\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.WalletScreeningScreenParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.walletScreening().screen(WalletScreeningScreenParams.builder()\n .walletAddress(\"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\")\n .blockchain(WalletScreeningScreenParams.Blockchain.of(\"ETH\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "walletScreening->screen([\n 'wallet_address' => '0x94f1b9b64e2932f6a2db338f616844400cd58e8a',\n 'blockchain' => 'ETH',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.wallet_screening.screen(\n wallet_address: \"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n blockchain: \"ETH\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.WalletScreening.ScreenAsync(new WalletScreeningScreenParams\n{\n WalletAddress = \"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n Blockchain = new WalletScreeningScreenParamsBlockchain(\"ETH\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -23163,7 +25084,7 @@ } }, "400": { - "description": "Validation error — malformed wallet address, missing `wallet_address`, unsupported `blockchain`, or LIGHTNING without an Elliptic or Chainalysis BYOK Marketplace connection." + "description": "Validation error — malformed wallet address, missing `wallet_address`, unsupported `blockchain`, `blockchain` omitted for an address whose format names no network, or LIGHTNING without an Elliptic or Chainalysis BYOK Marketplace connection." }, "401": { "description": "Missing or invalid `x-api-key`." @@ -23171,6 +25092,44 @@ "409": { "description": "No AML provider is configured for the application, or the configured provider does not support wallet screening yet. Configure transaction monitoring first." }, + "422": { + "description": "`blockchain` omitted for a `0x` address, which every EVM network shares. Nothing is screened or billed; resend with `blockchain` set to one of `candidate_chains`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "blockchain": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "A 0x address is valid on every EVM chain. Send blockchain as one of: ETH, BNB, MATIC, BASE, ARB, OP, CELO, MODE, PLUME." + ] + }, + "candidate_chains": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "ETH", + "BNB", + "MATIC", + "BASE", + "ARB", + "OP", + "CELO", + "MODE", + "PLUME" + ] + } + } + } + } + } + }, "502": { "description": "The AML provider could not complete the screening. Retry later." } @@ -23224,12 +25183,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\n# `result` is the dict returned by POST /v3/wallet-screening/, unmodified\nresponse = requests.post(\n 'https://verification.didit.me/v3/wallet-screening/pdf/',\n headers={'x-api-key': 'YOUR_API_KEY'},\n json=result,\n timeout=30,\n)\nresponse.raise_for_status()\nwith open('wallet_screening_report.pdf', 'wb') as fh:\n fh.write(response.content)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.wallet_screening.screen_pdf(\n provider=\"your-provider\",\n screening_type=\"WALLET_SCREENING\",\n risk_score=1,\n severity=\"UNKNOWN\",\n status=\"SCREENED\",\n summary=\"your-summary\",\n wallet_address=\"your-wallet-address\",\n blockchain=\"your-blockchain\",\n source_of_funds=[{}],\n destination_of_funds=[{}],\n counterparty_connections=[{}],\n sanctions_hit=True,\n dominant_risk_category=\"your-dominant-risk-category\",\n report_signature=\"your-report-signature\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n file.write(content)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "// `result` is the object returned by POST /v3/wallet-screening/, unmodified\nconst response = await fetch('https://verification.didit.me/v3/wallet-screening/pdf/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(result),\n});\nif (!response.ok) throw new Error(`PDF generation failed: HTTP ${response.status}`);\nconst pdfBuffer = Buffer.from(await response.arrayBuffer());" + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.walletScreening.screenPdf({\n provider: \"your-provider\",\n screening_type: \"WALLET_SCREENING\",\n risk_score: 1,\n severity: \"UNKNOWN\",\n status: \"SCREENED\",\n summary: \"your-summary\",\n wallet_address: \"your-wallet-address\",\n blockchain: \"your-blockchain\",\n source_of_funds: [{}],\n destination_of_funds: [{}],\n counterparty_connections: [{}],\n sanctions_hit: true,\n dominant_risk_category: \"your-dominant-risk-category\",\n report_signature: \"your-report-signature\",\n});\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.WalletScreening.ScreenPDF(ctx, didit.WalletScreeningResultParam{\n\tProvider: \"your-provider\",\n\tScreeningType: \"WALLET_SCREENING\",\n\tRiskScore: 1,\n\tSeverity: \"UNKNOWN\",\n\tStatus: \"SCREENED\",\n\tSummary: \"your-summary\",\n\tWalletAddress: \"your-wallet-address\",\n\tBlockchain: \"your-blockchain\",\n\tSourceOfFunds: []didit.WalletScreeningResultParamSourceOfFunds{{}},\n\tDestinationOfFunds: []didit.WalletScreeningResultParamDestinationOfFunds{{}},\n\tCounterpartyConnections: []didit.WalletScreeningResultParamCounterpartyConnections{{}},\n\tSanctionsHit: true,\n\tDominantRiskCategory: didit.String(\"your-dominant-risk-category\"),\n\tReportSignature: \"your-report-signature\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.WalletScreeningResult;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.walletScreening().screenPdf(WalletScreeningResult.builder()\n .provider(\"your-provider\")\n .screeningType(WalletScreeningResult.ScreeningType.of(\"WALLET_SCREENING\"))\n .riskScore(1L)\n .severity(WalletScreeningResult.Severity.of(\"UNKNOWN\"))\n .status(WalletScreeningResult.Status.of(\"SCREENED\"))\n .summary(\"your-summary\")\n .walletAddress(\"your-wallet-address\")\n .blockchain(\"your-blockchain\")\n .sourceOfFunds(List.of(WalletScreeningResult.SourceOfFunds.builder()\n .build()))\n .destinationOfFunds(List.of(WalletScreeningResult.DestinationOfFunds.builder()\n .build()))\n .counterpartyConnections(List.of(WalletScreeningResult.CounterpartyConnections.builder()\n .build()))\n .sanctionsHit(true)\n .dominantRiskCategory(\"your-dominant-risk-category\")\n .reportSignature(\"your-report-signature\")\n .build())\n .writeTo(Path.of(\"download.pdf\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "walletScreening->screenPdf([\n 'provider' => 'your-provider',\n 'screening_type' => 'WALLET_SCREENING',\n 'risk_score' => 1,\n 'severity' => 'UNKNOWN',\n 'status' => 'SCREENED',\n 'summary' => 'your-summary',\n 'wallet_address' => 'your-wallet-address',\n 'blockchain' => 'your-blockchain',\n 'source_of_funds' => [[]],\n 'destination_of_funds' => [[]],\n 'counterparty_connections' => [[]],\n 'sanctions_hit' => true,\n 'dominant_risk_category' => 'your-dominant-risk-category',\n 'report_signature' => 'your-report-signature',\n]);\n$content->saveTo('download.pdf');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.wallet_screening.screen_pdf(\n provider: \"your-provider\",\n screening_type: \"WALLET_SCREENING\",\n risk_score: 1,\n severity: \"UNKNOWN\",\n status: \"SCREENED\",\n summary: \"your-summary\",\n wallet_address: \"your-wallet-address\",\n blockchain: \"your-blockchain\",\n source_of_funds: [{}],\n destination_of_funds: [{}],\n counterparty_connections: [{}],\n sanctions_hit: true,\n dominant_risk_category: \"your-dominant-risk-category\",\n report_signature: \"your-report-signature\"\n)\nFile.binwrite(\"download.pdf\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.WalletScreening.ScreenPdfAsync(new WalletScreeningResult\n{\n Provider = \"your-provider\",\n ScreeningType = \"WALLET_SCREENING\",\n RiskScore = 1,\n Severity = \"UNKNOWN\",\n Status = \"SCREENED\",\n Summary = \"your-summary\",\n WalletAddress = \"your-wallet-address\",\n Blockchain = \"your-blockchain\",\n SourceOfFunds = new WalletScreeningResultSourceOfFunds[] { new() },\n DestinationOfFunds = new WalletScreeningResultDestinationOfFunds[] { new() },\n CounterpartyConnections = new WalletScreeningResultCounterpartyConnections[] { new() },\n SanctionsHit = true,\n DominantRiskCategory = \"your-dominant-risk-category\",\n ReportSignature = \"your-report-signature\",\n});\nawait content.SaveToAsync(\"download.pdf\");" } ], "responses": { @@ -23306,7 +25290,8 @@ "schema": { "type": "integer", "default": 50, - "minimum": 1 + "minimum": 1, + "maximum": 1000000 }, "description": "Page size. Defaults to 50 when omitted. There is no enforced maximum, but keep pages small for latency." }, @@ -23316,7 +25301,8 @@ "schema": { "type": "integer", "default": 0, - "minimum": 0 + "minimum": 0, + "maximum": 1000000 }, "description": "Zero-based offset of the first record to return. Prefer following the `next` URL from the previous page." }, @@ -23328,6 +25314,15 @@ "type": "string" }, "description": "Return only transactions whose Travel Rule transfer is in this exact status (for example `ON_HOLD` or `AWAITING_COUNTERPARTY`). `count` follows this filter; `total_transactions` still counts every transaction in the application." + }, + { + "name": "assignee", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "Comma-separated; a transaction matches when it meets any value. `unassigned` is what nobody holds yet, `rules` is what the rules decided on their own without a reviewer, and a member email matches the reviewer assigned to it. `me` is the signed-in Console reviewer, so an API key sending `me` gets `400`." } ], "x-codeSamples": [ @@ -23339,12 +25334,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/transactions/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'limit': 50},\n timeout=10,\n)\nresp.raise_for_status()\npage = resp.json()\nfor tx in page['results']:\n print(\n tx['transaction_number'],\n tx['status'],\n tx['severity'],\n f\"{tx['amount']} {tx['currency']}\",\n tx.get('subject_name') or tx.get('subject_vendor_data'),\n )" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.transactions.list():\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const url = new URL('https://verification.didit.me/v3/transactions/');\nurl.searchParams.set('limit', '50');\nconst page = await fetch(url, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n}).then((r) => r.json());\nfor (const tx of page.results) {\n console.log(tx.transaction_number, tx.status, tx.severity, tx.amount, tx.currency);\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.transactions.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Transactions.ListAutoPaging(ctx, didit.TransactionsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.transactions().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Transactions.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -23615,7 +25635,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot list transactions for this application. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot list transactions for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -23665,12 +25685,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/transactions/',\n headers={\n 'x-api-key': os.environ['DIDIT_API_KEY'],\n 'Content-Type': 'application/json',\n },\n json={\n 'transaction_id': 'your-txn-2026-05-17-001',\n 'transaction_category': 'finance',\n 'transaction_details': {\n 'direction': 'outbound',\n 'amount': 1500,\n 'currency': 'EUR',\n 'action_type': 'withdrawal',\n },\n 'subject': {\n 'entity_type': 'individual',\n 'vendor_data': 'user-12345',\n 'full_name': 'Maria Garcia',\n },\n },\n timeout=15,\n)\nresp.raise_for_status()\ntx = resp.json()\nprint(tx['txn_id'], '->', tx['status'], tx['severity'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.create(\n transaction_id=\"your-txn-2026-05-17-001\",\n transaction_category=\"finance\",\n transaction_details={\n \"direction\": \"outbound\",\n \"amount\": 1500.0,\n \"currency\": \"EUR\",\n \"action_type\": \"withdrawal\",\n },\n subject={\n \"entity_type\": \"individual\",\n \"vendor_data\": \"user-12345\",\n \"full_name\": \"Maria Garcia\",\n },\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/transactions/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n transaction_id: 'your-txn-2026-05-17-001',\n transaction_category: 'finance',\n transaction_details: {\n direction: 'outbound',\n amount: 1500,\n currency: 'EUR',\n action_type: 'withdrawal',\n },\n subject: {\n entity_type: 'individual',\n vendor_data: 'user-12345',\n full_name: 'Maria Garcia',\n },\n }),\n});\nif (!resp.ok) throw new Error(await resp.text());\nconst tx = await resp.json();\nconsole.log(tx.txn_id, tx.status, tx.severity);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.create({\n transaction_id: \"your-txn-2026-05-17-001\",\n transaction_category: \"finance\",\n transaction_details: {\n direction: \"outbound\",\n amount: 1500.0,\n currency: \"EUR\",\n action_type: \"withdrawal\",\n },\n subject: {\n entity_type: \"individual\",\n vendor_data: \"user-12345\",\n full_name: \"Maria Garcia\",\n },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Create(ctx, didit.TransactionsCreateParams{\n\tTransactionID: \"your-txn-2026-05-17-001\",\n\tTransactionCategory: \"finance\",\n\tTransactionDetails: didit.TransactionsCreateParamsTransactionDetails{\n\t\tDirection: \"outbound\",\n\t\tAmount: 1500.0,\n\t\tCurrency: \"EUR\",\n\t\tActionType: didit.String(\"withdrawal\"),\n\t},\n\tSubject: didit.TransactionsCreateParamsSubject{\n\t\tEntityType: didit.String(\"individual\"),\n\t\tVendorData: \"user-12345\",\n\t\tFullName: \"Maria Garcia\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TransactionsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().create(TransactionsCreateParams.builder()\n .transactionId(\"your-txn-2026-05-17-001\")\n .transactionCategory(TransactionsCreateParams.TransactionCategory.of(\"finance\"))\n .transactionDetails(TransactionsCreateParams.TransactionDetails.builder()\n .direction(TransactionsCreateParams.TransactionDetails.Direction.of(\"outbound\"))\n .amount(1500.0)\n .currency(\"EUR\")\n .actionType(\"withdrawal\")\n .build())\n .subject(TransactionsCreateParams.Subject.builder()\n .entityType(\"individual\")\n .vendorData(\"user-12345\")\n .fullName(\"Maria Garcia\")\n .build())\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->create([\n 'transaction_id' => 'your-txn-2026-05-17-001',\n 'transaction_category' => 'finance',\n 'transaction_details' => [\n 'direction' => 'outbound',\n 'amount' => 1500.0,\n 'currency' => 'EUR',\n 'action_type' => 'withdrawal',\n ],\n 'subject' => [\n 'entity_type' => 'individual',\n 'vendor_data' => 'user-12345',\n 'full_name' => 'Maria Garcia',\n ],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.create(\n transaction_id: \"your-txn-2026-05-17-001\",\n transaction_category: \"finance\",\n transaction_details: {\n direction: \"outbound\",\n amount: 1500.0,\n currency: \"EUR\",\n action_type: \"withdrawal\",\n },\n subject: {\n entity_type: \"individual\",\n vendor_data: \"user-12345\",\n full_name: \"Maria Garcia\",\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.CreateAsync(new TransactionsCreateParams\n{\n TransactionId = \"your-txn-2026-05-17-001\",\n TransactionCategory = \"finance\",\n TransactionDetails = new()\n {\n Direction = \"outbound\",\n Amount = 1500.0,\n Currency = \"EUR\",\n ActionType = \"withdrawal\",\n },\n Subject = new()\n {\n EntityType = \"individual\",\n VendorData = \"user-12345\",\n FullName = \"Maria Garcia\",\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -23732,7 +25777,7 @@ }, "amount": { "type": "number", - "description": "Transaction amount (up to 18 decimal places). Send it as a decimal string (e.g. `\"0.123456789012345678\"`) when exact precision matters: a JSON number is parsed as a binary float first, so digits beyond about 15 significant digits are rounded before the amount is stored.", + "description": "Transaction amount (up to 18 decimal places). Send it as a decimal string (e.g. `\"0.123456789012345678\"`) when exact precision matters: a JSON number is parsed as a binary float first, so digits beyond about 15 significant digits are rounded before the amount is stored. Must be zero or greater: the direction carries the sign, and a negative amount returns `400`.", "example": 1500 }, "currency": { @@ -23747,7 +25792,7 @@ "amount_in_default_currency": { "type": "number", "nullable": true, - "description": "Pre-converted amount in the default currency. If omitted, automatic FX conversion is attempted." + "description": "Pre-converted amount in the default currency. If omitted, automatic FX conversion is attempted. Must be zero or greater." }, "default_currency": { "type": "string", @@ -23774,7 +25819,7 @@ "properties": { "crypto_chain": { "type": "string", - "description": "Actual network used for screening. Managed screening supports BTC, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base), OP (Optimism) and ARB (Arbitrum One). Always specify this for multi-network tokens. When it is missing for USDT, USDC or ETH sent with a 0x transaction hash, Didit looks the hash up on Ethereum, BNB Chain, Polygon, Base, Arbitrum and Optimism and screens it on the network where it is found; if no network has it, the transaction is not screened and custom_values.aml_screening_status is FAILED with the reason in custom_values.aml_screening_error. When it is missing for USDT or USDC screened by wallet (no transaction hash), a Tron address is screened on Tron, a Solana address on Solana, and a 0x address on the first of those six networks where it has sent a transaction or holds the token, or on Ethereum when it is active on none of them. Connected-provider coverage varies; LIGHTNING requires a supported connected provider.", + "description": "Actual network used for screening. Managed screening supports BTC, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base), OP (Optimism), ARB (Arbitrum One), AVAX (Avalanche C-Chain), ADA (Cardano), XLM (Stellar) and HBAR (Hedera). Common network names are accepted too, for example POLYGON or POL for MATIC, BSC for BNB and TRON for TRX. Always specify this for multi-network tokens. When it is missing for USDT, USDC or ETH sent with a 0x transaction hash, Didit looks the hash up on Ethereum, BNB Chain, Polygon, Base, Arbitrum and Optimism and screens it on the network where it is found; if no network has it, the transaction is not screened and custom_values.aml_screening_status is FAILED with the reason in custom_values.aml_screening_error. When it is missing for USDT or USDC screened by wallet (no transaction hash), a Tron address is screened on Tron, a Solana address on Solana, and a 0x address on the first of those six networks where it has sent a transaction or holds the token, or on Ethereum when it is active on none of them. Connected-provider coverage varies; LIGHTNING requires a supported connected provider.", "example": "BASE" } } @@ -24521,7 +26566,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot submit transactions for this application. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot submit transactions for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -24612,12 +26657,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nuuid = 'abcdef12-3456-7890-abcd-ef1234567890'\nresp = requests.get(\n f'https://verification.didit.me/v3/transactions/{uuid}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\ntx = resp.json()\nfor alert in tx['alerts']:\n print(alert.get('code'), alert.get('severity'))" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.retrieve(\n \"abcdef12-3456-7890-abcd-ef1234567890\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const uuid = 'abcdef12-3456-7890-abcd-ef1234567890';\nconst resp = await fetch(`https://verification.didit.me/v3/transactions/${uuid}/`, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Lookup failed: ${resp.status}`);\nconst tx = await resp.json();\nconsole.log(tx.status, tx.severity, tx.alerts.length, 'alerts');" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.retrieve(\"abcdef12-3456-7890-abcd-ef1234567890\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Retrieve(ctx, \"abcdef12-3456-7890-abcd-ef1234567890\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().retrieve(\"abcdef12-3456-7890-abcd-ef1234567890\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->retrieve('abcdef12-3456-7890-abcd-ef1234567890');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.retrieve(\"abcdef12-3456-7890-abcd-ef1234567890\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.RetrieveAsync(\"abcdef12-3456-7890-abcd-ef1234567890\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -24719,7 +26789,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot read this application's transactions. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot read this application's transactions. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -24832,7 +26902,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/transactions/sdk-token/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={'vendor_data': 'user-042', 'ttl_seconds': 900, 'max_uses': 3},\n timeout=10,\n)\nresp.raise_for_status()\ntoken = resp.json()\nprint(token['sdk_token'], token['expires_at'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.create_sdk_token(\n vendor_data=\"user-042\",\n ttl_seconds=900,\n max_uses=3,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.createSdkToken({\n vendor_data: \"user-042\",\n ttl_seconds: 900,\n max_uses: 3,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.CreateSDKToken(ctx, didit.TransactionsCreateSDKTokenParams{\n\tVendorData: \"user-042\",\n\tTTLSeconds: didit.Int(900),\n\tMaxUses: didit.Int(3),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TransactionsCreateSdkTokenParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().createSdkToken(TransactionsCreateSdkTokenParams.builder()\n .vendorData(\"user-042\")\n .ttlSeconds(900L)\n .maxUses(3L)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->createSdkToken([\n 'vendor_data' => 'user-042',\n 'ttl_seconds' => 900,\n 'max_uses' => 3,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.create_sdk_token(\n vendor_data: \"user-042\",\n ttl_seconds: 900,\n max_uses: 3\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.CreateSdkTokenAsync(new TransactionsCreateSdkTokenParams\n{\n VendorData = \"user-042\",\n TtlSeconds = 900,\n MaxUses = 3,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -25408,7 +27508,8 @@ "schema": { "type": "integer", "default": 50, - "minimum": 1 + "minimum": 1, + "maximum": 1000000 }, "description": "Page size. Defaults to 50 when omitted. There is no enforced maximum, but keep pages small for latency." }, @@ -25418,7 +27519,8 @@ "schema": { "type": "integer", "default": 0, - "minimum": 0 + "minimum": 0, + "maximum": 1000000 }, "description": "Zero-based offset of the first record to return. Prefer following the `next` URL from the previous page over computing this by hand." } @@ -25432,12 +27534,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/businesses/',\n headers={'x-api-key': 'YOUR_API_KEY'},\n params={'limit': 50},\n)\nresp.raise_for_status()\npage = resp.json()\nfor biz in page['results']:\n print(biz['vendor_data'], biz['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.businesses.list():\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const url = new URL('https://verification.didit.me/v3/businesses/');\nurl.searchParams.set('limit', '50');\n\nconst page = await fetch(url, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n}).then((r) => r.json());\nconsole.log(page.count, page.results.length);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.businesses.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Businesses.ListAutoPaging(ctx, didit.BusinessesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.businesses().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.businesses.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Businesses.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -25519,7 +27646,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot list businesses for this application. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot list businesses for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -25577,12 +27704,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/customization/',\n headers={'x-api-key': 'YOUR_API_KEY'},\n)\nresp.raise_for_status()\nbranding = resp.json()\nprint(branding['font_family'], branding['color_primary'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.customization.retrieve()\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const branding = await fetch(\n 'https://verification.didit.me/v3/customization/',\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n).then((r) => r.json());\nconsole.log(branding.font_family, branding.color_primary);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.customization.retrieve();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Customization.Retrieve(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.customization().retrieve();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "customization->retrieve();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.customization.retrieve\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Customization.RetrieveAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -25631,7 +27783,7 @@ } }, "403": { - "description": "API key missing, malformed, expired, or scoped to a different application. Didit returns 403 (never 401) for all authentication failures on this endpoint.", + "description": "API key missing, malformed, expired, or scoped to a different application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -25757,12 +27909,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.patch(\n 'https://verification.didit.me/v3/customization/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={'color_primary': '#123456', 'font_family': 'AR One Sans'},\n)\nresp.raise_for_status()\nprint(resp.json()['color_primary'])\n\n# Upload a logo (multipart):\nwith open('logo.png', 'rb') as logo:\n requests.patch(\n 'https://verification.didit.me/v3/customization/',\n headers={'x-api-key': 'YOUR_API_KEY'},\n files={'image_rectangular': logo},\n )" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.customization.update(\n image_rectangular=open(\"image_rectangular.jpg\", \"rb\"),\n image_rectangular_dark=open(\"image_rectangular_dark.jpg\", \"rb\"),\n image_favicon=open(\"image_favicon.jpg\", \"rb\"),\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/customization/', {\n method: 'PATCH',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ color_primary: '#123456', font_family: 'AR One Sans' }),\n});\nconst branding = await resp.json();\nconsole.log(branding.color_primary);" + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.customization.update({\n image_rectangular: await fileFromPath(\"image_rectangular.jpg\"),\n image_rectangular_dark: await fileFromPath(\"image_rectangular_dark.jpg\"),\n image_favicon: await fileFromPath(\"image_favicon.jpg\"),\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Customization.Update(ctx, didit.CustomizationUpdateParams{\n\tImageRectangular: didit.Some(didit.FileFromPath(\"image_rectangular.jpg\")),\n\tImageRectangularDark: didit.Some(didit.FileFromPath(\"image_rectangular_dark.jpg\")),\n\tImageFavicon: didit.Some(didit.FileFromPath(\"image_favicon.jpg\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.CustomizationUpdateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.customization().update(CustomizationUpdateParams.builder()\n .imageRectangular(Path.of(\"image_rectangular.jpg\"))\n .imageRectangularDark(Path.of(\"image_rectangular_dark.jpg\"))\n .imageFavicon(Path.of(\"image_favicon.jpg\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "customization->update([\n 'image_rectangular' => File::fromPath('image_rectangular.jpg'),\n 'image_rectangular_dark' => File::fromPath('image_rectangular_dark.jpg'),\n 'image_favicon' => File::fromPath('image_favicon.jpg'),\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.customization.update(\n image_rectangular: Pathname(\"image_rectangular.jpg\"),\n image_rectangular_dark: Pathname(\"image_rectangular_dark.jpg\"),\n image_favicon: Pathname(\"image_favicon.jpg\")\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Customization.UpdateAsync(new CustomizationUpdateParams\n{\n ImageRectangular = FileUpload.FromPath(\"image_rectangular.jpg\"),\n ImageRectangularDark = FileUpload.FromPath(\"image_rectangular_dark.jpg\"),\n ImageFavicon = FileUpload.FromPath(\"image_favicon.jpg\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -25872,7 +28049,7 @@ } }, "403": { - "description": "API key missing, malformed, expired, or scoped to a different application. Didit returns 403 (never 401) for all authentication failures on this endpoint.", + "description": "API key missing, malformed, expired, or scoped to a different application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -25931,12 +28108,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/businesses/company-123/',\n headers={'x-api-key': 'YOUR_API_KEY'},\n)\nresp.raise_for_status()\nbiz = resp.json()\nprint(biz['didit_internal_id'], biz['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.retrieve(\n \"company-123\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const vendorData = encodeURIComponent('company-123');\nconst biz = await fetch(\n `https://verification.didit.me/v3/businesses/${vendorData}/`,\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n).then((r) => r.json());\nconsole.log(biz.didit_internal_id, biz.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.retrieve(\"company-123\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.Retrieve(ctx, \"company-123\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().retrieve(\"company-123\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->retrieve('company-123');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.retrieve(\"company-123\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.RetrieveAsync(\"company-123\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -25993,7 +28195,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot read this application's businesses. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot read this application's businesses. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -26166,12 +28368,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.patch(\n 'https://verification.didit.me/v3/businesses/company-123/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={'display_name': 'Acme Corp', 'status': 'FLAGGED'},\n)\nresp.raise_for_status()\nprint(resp.json()['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.update(\n \"company-123\",\n display_name=\"Acme Corp\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/businesses/company-123/', {\n method: 'PATCH',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ display_name: 'Acme Corp', status: 'FLAGGED' }),\n});\nconst biz = await resp.json();\nconsole.log(biz.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.update(\"company-123\", {\n display_name: \"Acme Corp\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.Update(ctx, \"company-123\", didit.BusinessesUpdateParams{\n\tDisplayName: didit.String(\"Acme Corp\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.BusinessesUpdateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().update(\"company-123\", BusinessesUpdateParams.builder()\n .displayName(\"Acme Corp\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->update('company-123', [\n 'display_name' => 'Acme Corp',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.update(\n \"company-123\",\n display_name: \"Acme Corp\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.UpdateAsync(\"company-123\", new BusinessesUpdateParams\n{\n DisplayName = \"Acme Corp\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -26259,7 +28486,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot update businesses for this application. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot update businesses for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -26395,12 +28622,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.patch(\n 'https://verification.didit.me/v3/businesses/company-123/update-status/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={'status': 'BLOCKED'},\n)\nresp.raise_for_status()\nprint(resp.json()['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.update_status(\n \"company-123\",\n status=\"FLAGGED\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/businesses/company-123/update-status/', {\n method: 'PATCH',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ status: 'BLOCKED' }),\n});\nconst biz = await resp.json();\nconsole.log(biz.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.updateStatus(\"company-123\", {\n status: \"FLAGGED\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.UpdateStatus(ctx, \"company-123\", didit.BusinessesUpdateStatusParams{\n\tStatus: \"FLAGGED\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.BusinessesUpdateStatusParams;\nimport me.didit.types.EntityStatusUpdateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().updateStatus(\"company-123\", BusinessesUpdateStatusParams.builder()\n .status(EntityStatusUpdateRequest.Status.of(\"FLAGGED\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->updateStatus('company-123', [\n 'status' => 'FLAGGED',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.update_status(\n \"company-123\",\n status: \"FLAGGED\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.UpdateStatusAsync(\"company-123\", new BusinessesUpdateStatusParams\n{\n Status = \"FLAGGED\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -26487,7 +28739,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot update businesses for this application. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot update businesses for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -26618,12 +28870,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/businesses/delete/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={'vendor_data_list': ['company-123', 'company-456']},\n)\nresp.raise_for_status()\nprint('deleted', resp.json()['deleted'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.batch_delete(\n vendor_data_list=[\"company-123\", \"company-456\"],\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/businesses/delete/', {\n method: 'POST',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ vendor_data_list: ['company-123', 'company-456'] }),\n});\nconst body = await resp.json();\nconsole.log('deleted', body.deleted);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.batchDelete({\n vendor_data_list: [\"company-123\", \"company-456\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.BatchDelete(ctx, didit.BusinessesBatchDeleteParams{\n\tVendorDataList: didit.Some([]string{\"company-123\", \"company-456\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.BusinessesBatchDeleteParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().batchDelete(BusinessesBatchDeleteParams.builder()\n .vendorDataList(List.of(\"company-123\", \"company-456\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->batchDelete([\n 'vendor_data_list' => ['company-123', 'company-456'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.batch_delete(vendor_data_list: [\"company-123\", \"company-456\"])\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.BatchDeleteAsync(new BusinessesBatchDeleteParams\n{\n VendorDataList = new string[] { \"company-123\", \"company-456\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -26670,7 +28947,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot delete businesses for this application. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot delete businesses for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -26815,12 +29092,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/users/aml-monitoring/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={'is_enabled': True, 'vendor_data_list': ['user-123', 'user-456']},\n)\nresp.raise_for_status()\njob = resp.json()\nprint(job['status'], job['outcomes'])\nfor row in job['results']:\n print(row['vendor_data'], row['outcome'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.set_aml_monitoring(\n is_enabled=True,\n estimate_only=True,\n vendor_data_list=[\"user-123\", \"user-456\"],\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/users/aml-monitoring/', {\n method: 'POST',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ is_enabled: true, vendor_data_list: ['user-123', 'user-456'] }),\n});\nconst job = await resp.json();\nconsole.log(job.status, job.outcomes);\nfor (const row of job.results) console.log(row.vendor_data, row.outcome);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.setAmlMonitoring({\n is_enabled: true,\n estimate_only: true,\n vendor_data_list: [\"user-123\", \"user-456\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.SetAMLMonitoring(ctx, didit.UsersSetAMLMonitoringParams{\n\tIsEnabled: true,\n\tEstimateOnly: didit.Bool(true),\n\tVendorDataList: didit.Some([]string{\"user-123\", \"user-456\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.UsersSetAmlMonitoringParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().setAmlMonitoring(UsersSetAmlMonitoringParams.builder()\n .isEnabled(true)\n .estimateOnly(true)\n .vendorDataList(List.of(\"user-123\", \"user-456\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->setAmlMonitoring([\n 'is_enabled' => true,\n 'estimate_only' => true,\n 'vendor_data_list' => ['user-123', 'user-456'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.set_aml_monitoring(\n is_enabled: true,\n estimate_only: true,\n vendor_data_list: [\"user-123\", \"user-456\"]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.SetAmlMonitoringAsync(new UsersSetAmlMonitoringParams\n{\n IsEnabled = true,\n EstimateOnly = true,\n VendorDataList = new string[] { \"user-123\", \"user-456\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -27012,12 +29314,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/businesses/aml-monitoring/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={'is_enabled': True, 'vendor_data_list': ['company-123', 'company-456']},\n)\nresp.raise_for_status()\njob = resp.json()\nprint(job['status'], job['outcomes'])\nfor row in job['results']:\n print(row['vendor_data'], row['outcome'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.set_aml_monitoring(\n is_enabled=True,\n estimate_only=True,\n vendor_data_list=[\"company-123\", \"company-456\"],\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/businesses/aml-monitoring/', {\n method: 'POST',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ is_enabled: true, vendor_data_list: ['company-123', 'company-456'] }),\n});\nconst job = await resp.json();\nconsole.log(job.status, job.outcomes);\nfor (const row of job.results) console.log(row.vendor_data, row.outcome);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.setAmlMonitoring({\n is_enabled: true,\n estimate_only: true,\n vendor_data_list: [\"company-123\", \"company-456\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.SetAMLMonitoring(ctx, didit.BusinessesSetAMLMonitoringParams{\n\tIsEnabled: true,\n\tEstimateOnly: didit.Bool(true),\n\tVendorDataList: didit.Some([]string{\"company-123\", \"company-456\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.BusinessesSetAmlMonitoringParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().setAmlMonitoring(BusinessesSetAmlMonitoringParams.builder()\n .isEnabled(true)\n .estimateOnly(true)\n .vendorDataList(List.of(\"company-123\", \"company-456\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->setAmlMonitoring([\n 'is_enabled' => true,\n 'estimate_only' => true,\n 'vendor_data_list' => ['company-123', 'company-456'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.set_aml_monitoring(\n is_enabled: true,\n estimate_only: true,\n vendor_data_list: [\"company-123\", \"company-456\"]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.SetAmlMonitoringAsync(new BusinessesSetAmlMonitoringParams\n{\n IsEnabled = true,\n EstimateOnly = true,\n VendorDataList = new string[] { \"company-123\", \"company-456\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -27149,12 +29476,37 @@ { "lang": "python", "label": "Python", - "source": "import time\nimport requests\n\nurl = 'https://verification.didit.me/v3/aml-monitoring/jobs/JOB_ID/'\nwhile True:\n job = requests.get(url, headers={'x-api-key': 'YOUR_API_KEY'}).json()\n if job['status'] in ('COMPLETED', 'FAILED'):\n break\n time.sleep(2)\nprint(job['outcomes'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.aml_monitoring.retrieve_job(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const url = 'https://verification.didit.me/v3/aml-monitoring/jobs/JOB_ID/';\nlet job;\ndo {\n await new Promise((r) => setTimeout(r, 2000));\n job = await (await fetch(url, { headers: { 'x-api-key': process.env.DIDIT_API_KEY } })).json();\n} while (job.status === 'PENDING' || job.status === 'PROCESSING');\nconsole.log(job.outcomes);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.amlMonitoring.retrieveJob(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AMLMonitoring.RetrieveJob(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.amlMonitoring().retrieveJob(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "amlMonitoring->retrieveJob('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.aml_monitoring.retrieve_job(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.AmlMonitoring.RetrieveJobAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -27387,12 +29739,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.patch(\n 'https://verification.didit.me/v3/users/user-abc-123/update-status/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={'status': 'BLOCKED'},\n)\nresp.raise_for_status()\nprint(resp.json()['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.update_status(\n \"user-123\",\n status=\"ACTIVE\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/users/user-abc-123/update-status/', {\n method: 'PATCH',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ status: 'BLOCKED' }),\n});\nconst user = await resp.json();\nconsole.log(user.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.updateStatus(\"user-123\", {\n status: \"ACTIVE\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.UpdateStatus(ctx, \"user-123\", didit.UsersUpdateStatusParams{\n\tStatus: \"ACTIVE\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.EntityStatusUpdateRequest;\nimport me.didit.types.UsersUpdateStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().updateStatus(\"user-123\", UsersUpdateStatusParams.builder()\n .status(EntityStatusUpdateRequest.Status.of(\"ACTIVE\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->updateStatus('user-123', [\n 'status' => 'ACTIVE',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.update_status(\n \"user-123\",\n status: \"ACTIVE\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.UpdateStatusAsync(\"user-123\", new UsersUpdateStatusParams\n{\n Status = \"ACTIVE\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -27545,7 +29922,7 @@ } }, "403": { - "description": "Invalid or revoked API key, or the key cannot update users for this application. Note: on this endpoint an *invalid* key returns `403` (not `401`).", + "description": "The key cannot update users for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -27698,12 +30075,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/businesses/create/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={\n 'vendor_data': 'company-456',\n 'legal_name': 'New Corp Ltd',\n 'country_code': 'US',\n },\n)\nresp.raise_for_status()\nbiz = resp.json()\nprint(biz['didit_internal_id'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.create(\n vendor_data=\"company-456\",\n legal_name=\"New Corp Ltd\",\n country_code=\"US\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/businesses/create/', {\n method: 'POST',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n vendor_data: 'company-456',\n legal_name: 'New Corp Ltd',\n country_code: 'US',\n }),\n});\nconst biz = await resp.json();\nconsole.log(biz.didit_internal_id);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.create({\n vendor_data: \"company-456\",\n legal_name: \"New Corp Ltd\",\n country_code: \"US\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.Create(ctx, didit.BusinessesCreateParams{\n\tVendorData: didit.String(\"company-456\"),\n\tLegalName: didit.String(\"New Corp Ltd\"),\n\tCountryCode: didit.String(\"US\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.BusinessesCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().create(BusinessesCreateParams.builder()\n .vendorData(\"company-456\")\n .legalName(\"New Corp Ltd\")\n .countryCode(\"US\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->create([\n 'vendor_data' => 'company-456',\n 'legal_name' => 'New Corp Ltd',\n 'country_code' => 'US',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.create(\n vendor_data: \"company-456\",\n legal_name: \"New Corp Ltd\",\n country_code: \"US\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.CreateAsync(new BusinessesCreateParams\n{\n VendorData = \"company-456\",\n LegalName = \"New Corp Ltd\",\n CountryCode = \"US\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -27775,7 +30177,7 @@ } }, "403": { - "description": "Missing, invalid, or revoked API key, or the key cannot create businesses for this application. This endpoint returns `403` (never `401`) for authentication failures, including requests with no credentials at all.", + "description": "Missing, invalid, or revoked API key, or the key cannot create businesses for this application. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -27995,12 +30397,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/users/create/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={'vendor_data': 'user-abc-123', 'full_name': 'John Doe'},\n)\nresp.raise_for_status()\nuser = resp.json()\nprint(user['didit_internal_id'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.create(\n vendor_data=\"user-abc-123\",\n full_name=\"John Doe\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/users/create/', {\n method: 'POST',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ vendor_data: 'user-abc-123', full_name: 'John Doe' }),\n});\nconst user = await resp.json();\nconsole.log(user.didit_internal_id);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.create({\n vendor_data: \"user-abc-123\",\n full_name: \"John Doe\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.Create(ctx, didit.UsersCreateParams{\n\tVendorData: \"user-abc-123\",\n\tFullName: didit.String(\"John Doe\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.UsersCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().create(UsersCreateParams.builder()\n .vendorData(\"user-abc-123\")\n .fullName(\"John Doe\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->create([\n 'vendor_data' => 'user-abc-123',\n 'full_name' => 'John Doe',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.create(\n vendor_data: \"user-abc-123\",\n full_name: \"John Doe\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.CreateAsync(new UsersCreateParams\n{\n VendorData = \"user-abc-123\",\n FullName = \"John Doe\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -28250,7 +30677,7 @@ } }, "403": { - "description": "Invalid or revoked API key, or the key cannot create users for this application. A scoped API key needs `users` write, and also `sessions` write when `send_verification_link` is `true`; nothing is written. Note: on this endpoint an *invalid* key returns `403` (not `401`).", + "description": "Invalid or revoked API key, or the key cannot create users for this application. A scoped API key needs `users` write, and also `sessions` write when `send_verification_link` is `true`; nothing is written. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -28381,12 +30808,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/vendor-users/by-id/f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418/faces/upload/',\n headers={'x-api-key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},\n json={\n 'image': '/9j/4AAQSkZJRgABAQEA...',\n 'comment': 'Imported from previous KYC provider',\n },\n)\nresp.raise_for_status()\nface = resp.json()\nprint(face['uuid'], face['image_url'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.users.upload_face(\n \"11111111-2222-3333-4444-555555555555\",\n image=\"/9j/4AAQSkZJRgABAQEA...\",\n comment=\"Imported from previous KYC provider\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/vendor-users/by-id/f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418/faces/upload/', {\n method: 'POST',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n image: '/9j/4AAQSkZJRgABAQEA...',\n comment: 'Imported from previous KYC provider',\n }),\n});\nconst face = await resp.json();\nconsole.log(face.uuid, face.image_url);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.users.uploadFace(\"11111111-2222-3333-4444-555555555555\", {\n image: \"/9j/4AAQSkZJRgABAQEA...\",\n comment: \"Imported from previous KYC provider\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Users.UploadFace(ctx, \"11111111-2222-3333-4444-555555555555\", didit.UsersUploadFaceParams{\n\tImage: \"/9j/4AAQSkZJRgABAQEA...\",\n\tComment: didit.String(\"Imported from previous KYC provider\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.UsersUploadFaceParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.users().uploadFace(\"11111111-2222-3333-4444-555555555555\", UsersUploadFaceParams.builder()\n .image(\"/9j/4AAQSkZJRgABAQEA...\")\n .comment(\"Imported from previous KYC provider\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->uploadFace('11111111-2222-3333-4444-555555555555', [\n 'image' => '/9j/4AAQSkZJRgABAQEA...',\n 'comment' => 'Imported from previous KYC provider',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.users.upload_face(\n \"11111111-2222-3333-4444-555555555555\",\n image: \"/9j/4AAQSkZJRgABAQEA...\",\n comment: \"Imported from previous KYC provider\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Users.UploadFaceAsync(\"11111111-2222-3333-4444-555555555555\", new UsersUploadFaceParams\n{\n Image = \"/9j/4AAQSkZJRgABAQEA...\",\n Comment = \"Imported from previous KYC provider\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -29082,7 +31534,7 @@ } }, "403": { - "description": "Missing/invalid credentials or insufficient permissions. This API returns `403` for authentication failures — never `401`.", + "description": "Missing credentials or insufficient permissions. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -29168,12 +31620,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.patch(\n \"https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-data/\",\n headers={\n \"x-api-key\": \"YOUR_API_KEY\",\n \"Content-Type\": \"application/json\",\n },\n json={\n \"first_name\": \"Carmen\",\n \"last_name\": \"Espanola Espanola\",\n \"date_of_birth\": \"1980-01-01\",\n \"issuing_state\": \"ESP\",\n \"extra_fields\": {\"blood_group\": \"O+\"},\n \"parsed_address\": {\"city\": \"Madrid\", \"postal_code\": \"28013\", \"country\": \"ES\"},\n },\n)\nresponse.raise_for_status()\nkyc = response.json() # full current KYC record\nprint(kyc[\"first_name\"], kyc[\"parsed_address\"][\"formatted_address\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_data(\n \"11111111-2222-3333-4444-555555555555\",\n date_of_birth=\"1980-01-01\",\n issuing_state=\"ESP\",\n first_name=\"Carmen\",\n last_name=\"Espanola Espanola\",\n marital_status=\"MARRIED\",\n extra_fields={\"blood_group\": \"O+\"},\n parsed_address={\n \"city\": \"Madrid\",\n \"street_1\": \"Avda de Madrid 34\",\n \"postal_code\": \"28013\",\n \"country\": \"ES\",\n },\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const response = await fetch(\n 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-data/',\n {\n method: 'PATCH',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n first_name: 'Carmen',\n last_name: 'Espanola Espanola',\n date_of_birth: '1980-01-01',\n issuing_state: 'ESP',\n parsed_address: { city: 'Madrid', postal_code: '28013', country: 'ES' },\n }),\n },\n);\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst kyc = await response.json(); // full current KYC record" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateData(\"11111111-2222-3333-4444-555555555555\", {\n date_of_birth: \"1980-01-01\",\n issuing_state: \"ESP\",\n first_name: \"Carmen\",\n last_name: \"Espanola Espanola\",\n marital_status: \"MARRIED\",\n extra_fields: { blood_group: \"O+\" },\n parsed_address: {\n city: \"Madrid\",\n street_1: \"Avda de Madrid 34\",\n postal_code: \"28013\",\n country: \"ES\",\n },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateData(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdateDataParams{\n\tDateOfBirth: didit.String(\"1980-01-01\"),\n\tIssuingState: didit.String(\"ESP\"),\n\tFirstName: didit.String(\"Carmen\"),\n\tLastName: didit.String(\"Espanola Espanola\"),\n\tMaritalStatus: didit.Some(didit.SessionsUpdateDataParamsMaritalStatus(\"MARRIED\")),\n\tExtraFields: didit.Some(map[string]any{\"blood_group\": \"O+\"}),\n\tParsedAddress: didit.Some(didit.SessionsUpdateDataParamsParsedAddress{\n\t\tCity: didit.String(\"Madrid\"),\n\t\tStreet1: didit.String(\"Avda de Madrid 34\"),\n\t\tPostalCode: didit.String(\"28013\"),\n\t\tCountry: didit.String(\"ES\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.LocalDate;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsUpdateDataParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateData(\"11111111-2222-3333-4444-555555555555\", SessionsUpdateDataParams.builder()\n .dateOfBirth(LocalDate.parse(\"1980-01-01\"))\n .issuingState(\"ESP\")\n .firstName(\"Carmen\")\n .lastName(\"Espanola Espanola\")\n .maritalStatus(SessionsUpdateDataParams.MaritalStatus.of(\"MARRIED\"))\n .extraFields(Map.of(\"blood_group\", \"O+\"))\n .parsedAddress(SessionsUpdateDataParams.ParsedAddress.builder()\n .city(\"Madrid\")\n .street1(\"Avda de Madrid 34\")\n .postalCode(\"28013\")\n .country(\"ES\")\n .build())\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->updateData('11111111-2222-3333-4444-555555555555', [\n 'date_of_birth' => '1980-01-01',\n 'issuing_state' => 'ESP',\n 'first_name' => 'Carmen',\n 'last_name' => 'Espanola Espanola',\n 'marital_status' => 'MARRIED',\n 'extra_fields' => ['blood_group' => 'O+'],\n 'parsed_address' => [\n 'city' => 'Madrid',\n 'street_1' => 'Avda de Madrid 34',\n 'postal_code' => '28013',\n 'country' => 'ES',\n ],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_data(\n \"11111111-2222-3333-4444-555555555555\",\n date_of_birth: \"1980-01-01\",\n issuing_state: \"ESP\",\n first_name: \"Carmen\",\n last_name: \"Espanola Espanola\",\n marital_status: \"MARRIED\",\n extra_fields: { blood_group: \"O+\" },\n parsed_address: {\n city: \"Madrid\",\n street_1: \"Avda de Madrid 34\",\n postal_code: \"28013\",\n country: \"ES\",\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateDataAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsUpdateDataParams\n{\n DateOfBirth = \"1980-01-01\",\n IssuingState = \"ESP\",\n FirstName = \"Carmen\",\n LastName = \"Espanola Espanola\",\n MaritalStatus = new SessionsUpdateDataParamsMaritalStatus(\"MARRIED\"),\n ExtraFields = new Dictionary { [\"blood_group\"] = \"O+\" },\n ParsedAddress = new SessionsUpdateDataParamsParsedAddress\n {\n City = \"Madrid\",\n Street1 = \"Avda de Madrid 34\",\n PostalCode = \"28013\",\n Country = \"ES\",\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -29464,7 +31941,7 @@ } }, "403": { - "description": "Missing/invalid credentials or insufficient permissions.", + "description": "Missing credentials or insufficient permissions.", "content": { "application/json": { "examples": { @@ -29521,7 +31998,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.patch(\n \"https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/features/feature_ocr_1/update-status/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\", \"Content-Type\": \"application/json\"},\n json={\"new_status\": \"Approved\", \"comment\": \"Document manually verified by compliance.\"},\n)\nprint(response.json())" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_feature_status(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_ocr_1\",\n new_status=\"Approved\",\n comment=\"Document manually verified by compliance.\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateFeatureStatus(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_ocr_1\",\n {\n new_status: \"Approved\",\n comment: \"Document manually verified by compliance.\",\n },\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateFeatureStatus(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_ocr_1\", didit.SessionsUpdateFeatureStatusParams{\n\tNewStatus: \"Approved\",\n\tComment: didit.String(\"Document manually verified by compliance.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateFeatureStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateFeatureStatus(\"11111111-2222-3333-4444-555555555555\", \"feature_ocr_1\", SessionsUpdateFeatureStatusParams.builder()\n .newStatus(SessionsUpdateFeatureStatusParams.NewStatus.of(\"Approved\"))\n .comment(\"Document manually verified by compliance.\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->updateFeatureStatus('11111111-2222-3333-4444-555555555555', 'feature_ocr_1', [\n 'new_status' => 'Approved',\n 'comment' => 'Document manually verified by compliance.',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_feature_status(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_ocr_1\",\n new_status: \"Approved\",\n comment: \"Document manually verified by compliance.\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateFeatureStatusAsync(\"11111111-2222-3333-4444-555555555555\", \"feature_ocr_1\", new SessionsUpdateFeatureStatusParams\n{\n NewStatus = \"Approved\",\n Comment = \"Document manually verified by compliance.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -29529,7 +32036,7 @@ "/v3/session/{sessionId}/update-aml-hit-status/": { "patch": { "summary": "Update an AML hit review status", - "description": "Set the review status of a **single AML hit** (a potential sanction / PEP / watchlist / adverse-media match) returned by AML screening, without changing the overall session decision. Identify the hit by its `hit_id` (the `id` of an entry in the AML check's `hits` array — see the session decision).\n\n`review_status` is one of `Unreviewed`, `Confirmed Match`, `False Positive`, or `Inconclusive`. Reviewer decisions are preserved across ongoing-monitoring updates, so a hit you mark `False Positive` stays that way when the provider re-screens.\n\nA successful call fires a `data.updated` webhook and appends an activity entry (with actor attribution) to the session's review trail. For graph workflows with multiple AML checks, pass `node_id` to target a specific check.\n\nAuthenticate with your API key (`x-api-key`) or a user authorization header — either must carry the `write:sessions` privilege.", + "description": "Set the review status of a **single AML hit** (a potential sanction / PEP / watchlist / adverse-media match) returned by AML screening, without changing the overall session decision. Identify the hit by its `hit_id` (the `id` of an entry in the AML check's `hits` array — see the session decision). A hit id returned in the earlier format is still accepted; the response always names the hit by its current `id`.\n\n`review_status` is one of `Unreviewed`, `Confirmed Match`, `False Positive`, or `Inconclusive`. Reviewer decisions are preserved across ongoing-monitoring updates, so a hit you mark `False Positive` stays that way when the provider re-screens.\n\nA successful call fires a `data.updated` webhook and appends an activity entry (with actor attribution) to the session's review trail. For graph workflows with multiple AML checks, pass `node_id` to target a specific check.\n\nAuthenticate with your API key (`x-api-key`) or a user authorization header — either must carry the `write:sessions` privilege.", "operationId": "patch_v3_session_update_aml_hit_status", "x-didit-sdk": { "resource": "sessions", @@ -29581,8 +32088,8 @@ "properties": { "hit_id": { "type": "string", - "description": "The `id` of the hit in the AML check's `hits` array.", - "example": "abc123" + "description": "The `id` of the hit in the AML check's `hits` array (`hit_...`). A hit id returned in the earlier format is still accepted.", + "example": "hit_7c1e9a40b2d35f86e0a4c912" }, "review_status": { "type": "string", @@ -29601,6 +32108,10 @@ "example": "feature_aml_1" } } + }, + "example": { + "hit_id": "hit_7c1e9a40b2d35f86e0a4c912", + "review_status": "False Positive" } } } @@ -29624,7 +32135,7 @@ }, "hit_id": { "type": "string", - "description": "The updated hit, with surrounding whitespace removed." + "description": "The `id` of the updated hit, as the session decision returns it, also when the request named the hit by an id in the earlier format." }, "review_status": { "type": "string", @@ -29640,7 +32151,7 @@ }, "example": { "message": "Hit status updated successfully", - "hit_id": "abc123", + "hit_id": "hit_7c1e9a40b2d35f86e0a4c912", "review_status": "False Positive" } } @@ -29659,7 +32170,7 @@ } }, "403": { - "description": "Missing/invalid credentials or insufficient permissions. This API returns `403` for authentication failures — never `401`.", + "description": "Missing credentials or insufficient permissions. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -29693,7 +32204,7 @@ "Hit Not Found": { "summary": "Unknown hit_id", "value": { - "detail": "Hit with ID 'abc123' not found in the AML check." + "detail": "Hit with ID 'hit_9d2e7f41c0a8b3e65d1f0c47' not found in the AML check." } } } @@ -29710,7 +32221,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.patch(\n \"https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-aml-hit-status/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\", \"Content-Type\": \"application/json\"},\n json={\"hit_id\": \"abc123\", \"review_status\": \"False Positive\"},\n)\nprint(response.json())" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_aml_hit_status(\n \"11111111-2222-3333-4444-555555555555\",\n hit_id=\"hit_7c1e9a40b2d35f86e0a4c912\",\n review_status=\"False Positive\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateAmlHitStatus(\"11111111-2222-3333-4444-555555555555\", {\n hit_id: \"hit_7c1e9a40b2d35f86e0a4c912\",\n review_status: \"False Positive\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateAMLHitStatus(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdateAMLHitStatusParams{\n\tHitID: \"hit_7c1e9a40b2d35f86e0a4c912\",\n\tReviewStatus: \"False Positive\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateAmlHitStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateAmlHitStatus(\"11111111-2222-3333-4444-555555555555\", SessionsUpdateAmlHitStatusParams.builder()\n .hitId(\"hit_7c1e9a40b2d35f86e0a4c912\")\n .reviewStatus(SessionsUpdateAmlHitStatusParams.ReviewStatus.of(\"False Positive\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->updateAmlHitStatus('11111111-2222-3333-4444-555555555555', [\n 'hit_id' => 'hit_7c1e9a40b2d35f86e0a4c912',\n 'review_status' => 'False Positive',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_aml_hit_status(\n \"11111111-2222-3333-4444-555555555555\",\n hit_id: \"hit_7c1e9a40b2d35f86e0a4c912\",\n review_status: \"False Positive\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateAmlHitStatusAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsUpdateAmlHitStatusParams\n{\n HitId = \"hit_7c1e9a40b2d35f86e0a4c912\",\n ReviewStatus = \"False Positive\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -29779,7 +32320,8 @@ "properties": { "hit_id": { "type": "string", - "example": "abc123" + "example": "hit_7c1e9a40b2d35f86e0a4c912", + "description": "The `id` of the hit in the AML check's `hits` array (`hit_...`). A hit id returned in the earlier format is still accepted." }, "review_status": { "type": "string", @@ -29800,6 +32342,18 @@ "example": "feature_aml_1" } } + }, + "example": { + "hit_updates": [ + { + "hit_id": "hit_7c1e9a40b2d35f86e0a4c912", + "review_status": "Confirmed Match" + }, + { + "hit_id": "hit_3b8f20d6a91c4e75f0b2d6a8", + "review_status": "False Positive" + } + ] } } } @@ -29825,15 +32379,15 @@ "items": { "type": "string" }, - "description": "The `hit_id` of every entry in `hit_updates`, in request order, including hits whose status did not change." + "description": "The `id` of the hit each entry in `hit_updates` names, as the session decision returns it, in request order, including hits whose status did not change." } } }, "example": { "message": "Updated 2 hit(s) successfully", "updated_hits": [ - "abc123", - "def456" + "hit_7c1e9a40b2d35f86e0a4c912", + "hit_3b8f20d6a91c4e75f0b2d6a8" ] } } @@ -29852,7 +32406,7 @@ } }, "403": { - "description": "Missing/invalid credentials or insufficient permissions. This API returns `403` for authentication failures — never `401`.", + "description": "Missing credentials or insufficient permissions. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -29877,7 +32431,7 @@ "content": { "application/json": { "example": { - "detail": "Hits not found: zzz999" + "detail": "Hits not found: hit_9d2e7f41c0a8b3e65d1f0c47" } } } @@ -29892,7 +32446,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.patch(\n \"https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/bulk-update-aml-hit-status/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\", \"Content-Type\": \"application/json\"},\n json={\n \"hit_updates\": [\n {\"hit_id\": \"abc123\", \"review_status\": \"Confirmed Match\"},\n {\"hit_id\": \"def456\", \"review_status\": \"False Positive\"},\n ]\n },\n)\nprint(response.json())" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.bulk_update_aml_hit_status(\n \"11111111-2222-3333-4444-555555555555\",\n hit_updates=[{\n \"hit_id\": \"hit_7c1e9a40b2d35f86e0a4c912\",\n \"review_status\": \"Confirmed Match\",\n }, {\n \"hit_id\": \"hit_3b8f20d6a91c4e75f0b2d6a8\",\n \"review_status\": \"False Positive\",\n }],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.bulkUpdateAmlHitStatus(\"11111111-2222-3333-4444-555555555555\", {\n hit_updates: [{\n hit_id: \"hit_7c1e9a40b2d35f86e0a4c912\",\n review_status: \"Confirmed Match\",\n }, {\n hit_id: \"hit_3b8f20d6a91c4e75f0b2d6a8\",\n review_status: \"False Positive\",\n }],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.BulkUpdateAMLHitStatus(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsBulkUpdateAMLHitStatusParams{\n\tHitUpdates: []didit.SessionsBulkUpdateAMLHitStatusParamsHitUpdates{{\n\t\tHitID: \"hit_7c1e9a40b2d35f86e0a4c912\",\n\t\tReviewStatus: \"Confirmed Match\",\n\t}, {\n\t\tHitID: \"hit_3b8f20d6a91c4e75f0b2d6a8\",\n\t\tReviewStatus: \"False Positive\",\n\t}},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.SessionsBulkUpdateAmlHitStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().bulkUpdateAmlHitStatus(\"11111111-2222-3333-4444-555555555555\", SessionsBulkUpdateAmlHitStatusParams.builder()\n .hitUpdates(List.of(\n SessionsBulkUpdateAmlHitStatusParams.HitUpdates.builder()\n .hitId(\"hit_7c1e9a40b2d35f86e0a4c912\")\n .reviewStatus(SessionsBulkUpdateAmlHitStatusParams.HitUpdates.ReviewStatus.of(\"Confirmed Match\"))\n .build(),\n SessionsBulkUpdateAmlHitStatusParams.HitUpdates.builder()\n .hitId(\"hit_3b8f20d6a91c4e75f0b2d6a8\")\n .reviewStatus(SessionsBulkUpdateAmlHitStatusParams.HitUpdates.ReviewStatus.of(\"False Positive\"))\n .build()))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->bulkUpdateAmlHitStatus('11111111-2222-3333-4444-555555555555', [\n 'hit_updates' => [[\n 'hit_id' => 'hit_7c1e9a40b2d35f86e0a4c912',\n 'review_status' => 'Confirmed Match',\n ], [\n 'hit_id' => 'hit_3b8f20d6a91c4e75f0b2d6a8',\n 'review_status' => 'False Positive',\n ]],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.bulk_update_aml_hit_status(\n \"11111111-2222-3333-4444-555555555555\",\n hit_updates: [{\n hit_id: \"hit_7c1e9a40b2d35f86e0a4c912\",\n review_status: \"Confirmed Match\",\n }, {\n hit_id: \"hit_3b8f20d6a91c4e75f0b2d6a8\",\n review_status: \"False Positive\",\n }]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.BulkUpdateAmlHitStatusAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsBulkUpdateAmlHitStatusParams\n{\n HitUpdates = new SessionsBulkUpdateAmlHitStatusParamsHitUpdates[]\n {\n new()\n {\n HitId = \"hit_7c1e9a40b2d35f86e0a4c912\",\n ReviewStatus = \"Confirmed Match\",\n },\n new()\n {\n HitId = \"hit_3b8f20d6a91c4e75f0b2d6a8\",\n ReviewStatus = \"False Positive\",\n },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -30295,7 +32879,7 @@ } }, "403": { - "description": "Missing/invalid credentials or insufficient permissions. This API returns `403` for authentication failures — never `401`.", + "description": "Missing credentials or insufficient permissions. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -30381,12 +32965,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.patch(\n \"https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-poa-data/\",\n headers={\n \"x-api-key\": \"YOUR_API_KEY\",\n \"Content-Type\": \"application/json\",\n },\n json={\n \"issuing_state\": \"ESP\",\n \"document_type\": \"BANK_STATEMENT\",\n \"issuer\": \"Banco Example S.A.\",\n \"issue_date\": \"2026-05-02\",\n \"name_on_document\": \"Carmen Espanola\",\n \"poa_address\": \"Avda de Madrid 34, 28013 Madrid\",\n \"extra_fields\": {\"bank_iban\": \"ES9121000418450200051332\"},\n \"poa_parsed_address\": {\"city\": \"Madrid\", \"postal_code\": \"28013\", \"country\": \"ES\"},\n },\n)\nresponse.raise_for_status()\npoa = response.json() # full current POA record\nprint(poa[\"issuer\"], poa[\"poa_formatted_address\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_poa_data(\n \"11111111-2222-3333-4444-555555555555\",\n issuing_state=\"ESP\",\n document_type=\"BANK_STATEMENT\",\n issuer=\"Banco Example S.A.\",\n issue_date=\"2026-05-02\",\n poa_address=\"Avda de Madrid 34, 28013 Madrid\",\n name_on_document=\"Carmen Espanola\",\n extra_fields={\"bank_iban\": \"ES9121000418450200051332\", \"additional_names\": [\"Carmen E. Espanola\"]},\n poa_parsed_address={\n \"city\": \"Madrid\",\n \"street_1\": \"Avda de Madrid 34\",\n \"postal_code\": \"28013\",\n \"country\": \"ES\",\n },\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const response = await fetch(\n 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-poa-data/',\n {\n method: 'PATCH',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n issuing_state: 'ESP',\n document_type: 'BANK_STATEMENT',\n issuer: 'Banco Example S.A.',\n issue_date: '2026-05-02',\n name_on_document: 'Carmen Espanola',\n poa_address: 'Avda de Madrid 34, 28013 Madrid',\n poa_parsed_address: { city: 'Madrid', postal_code: '28013', country: 'ES' },\n }),\n },\n);\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst poa = await response.json(); // full current POA record" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updatePoaData(\"11111111-2222-3333-4444-555555555555\", {\n issuing_state: \"ESP\",\n document_type: \"BANK_STATEMENT\",\n issuer: \"Banco Example S.A.\",\n issue_date: \"2026-05-02\",\n poa_address: \"Avda de Madrid 34, 28013 Madrid\",\n name_on_document: \"Carmen Espanola\",\n extra_fields: { bank_iban: \"ES9121000418450200051332\", additional_names: [\"Carmen E. Espanola\"] },\n poa_parsed_address: {\n city: \"Madrid\",\n street_1: \"Avda de Madrid 34\",\n postal_code: \"28013\",\n country: \"ES\",\n },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdatePOAData(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdatePOADataParams{\n\tIssuingState: didit.String(\"ESP\"),\n\tDocumentType: didit.Some(didit.SessionsUpdatePOADataParamsDocumentType(\"BANK_STATEMENT\")),\n\tIssuer: didit.String(\"Banco Example S.A.\"),\n\tIssueDate: didit.String(\"2026-05-02\"),\n\tPOAAddress: didit.String(\"Avda de Madrid 34, 28013 Madrid\"),\n\tNameOnDocument: didit.String(\"Carmen Espanola\"),\n\tExtraFields: didit.Some(map[string]any{\"bank_iban\": \"ES9121000418450200051332\", \"additional_names\": []any{\"Carmen E. Espanola\"}}),\n\tPOAParsedAddress: didit.Some(didit.SessionsUpdatePOADataParamsPOAParsedAddress{\n\t\tCity: didit.String(\"Madrid\"),\n\t\tStreet1: didit.String(\"Avda de Madrid 34\"),\n\t\tPostalCode: didit.String(\"28013\"),\n\t\tCountry: didit.String(\"ES\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.LocalDate;\nimport java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsUpdatePoaDataParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updatePoaData(\"11111111-2222-3333-4444-555555555555\", SessionsUpdatePoaDataParams.builder()\n .issuingState(\"ESP\")\n .documentType(SessionsUpdatePoaDataParams.DocumentType.of(\"BANK_STATEMENT\"))\n .issuer(\"Banco Example S.A.\")\n .issueDate(LocalDate.parse(\"2026-05-02\"))\n .poaAddress(\"Avda de Madrid 34, 28013 Madrid\")\n .nameOnDocument(\"Carmen Espanola\")\n .extraFields(Map.of(\"bank_iban\", \"ES9121000418450200051332\", \"additional_names\", List.of(\"Carmen E. Espanola\")))\n .poaParsedAddress(SessionsUpdatePoaDataParams.PoaParsedAddress.builder()\n .city(\"Madrid\")\n .street1(\"Avda de Madrid 34\")\n .postalCode(\"28013\")\n .country(\"ES\")\n .build())\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->updatePoaData('11111111-2222-3333-4444-555555555555', [\n 'issuing_state' => 'ESP',\n 'document_type' => 'BANK_STATEMENT',\n 'issuer' => 'Banco Example S.A.',\n 'issue_date' => '2026-05-02',\n 'poa_address' => 'Avda de Madrid 34, 28013 Madrid',\n 'name_on_document' => 'Carmen Espanola',\n 'extra_fields' => ['bank_iban' => 'ES9121000418450200051332', 'additional_names' => ['Carmen E. Espanola']],\n 'poa_parsed_address' => [\n 'city' => 'Madrid',\n 'street_1' => 'Avda de Madrid 34',\n 'postal_code' => '28013',\n 'country' => 'ES',\n ],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_poa_data(\n \"11111111-2222-3333-4444-555555555555\",\n issuing_state: \"ESP\",\n document_type: \"BANK_STATEMENT\",\n issuer: \"Banco Example S.A.\",\n issue_date: \"2026-05-02\",\n poa_address: \"Avda de Madrid 34, 28013 Madrid\",\n name_on_document: \"Carmen Espanola\",\n extra_fields: { bank_iban: \"ES9121000418450200051332\", additional_names: [\"Carmen E. Espanola\"] },\n poa_parsed_address: {\n city: \"Madrid\",\n street_1: \"Avda de Madrid 34\",\n postal_code: \"28013\",\n country: \"ES\",\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdatePoaDataAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsUpdatePoaDataParams\n{\n IssuingState = \"ESP\",\n DocumentType = new SessionsUpdatePoaDataParamsDocumentType(\"BANK_STATEMENT\"),\n Issuer = \"Banco Example S.A.\",\n IssueDate = \"2026-05-02\",\n PoaAddress = \"Avda de Madrid 34, 28013 Madrid\",\n NameOnDocument = \"Carmen Espanola\",\n ExtraFields = new Dictionary { [\"bank_iban\"] = \"ES9121000418450200051332\", [\"additional_names\"] = new object[] { \"Carmen E. Espanola\" } },\n PoaParsedAddress = new SessionsUpdatePoaDataParamsPoaParsedAddress\n {\n City = \"Madrid\",\n Street1 = \"Avda de Madrid 34\",\n PostalCode = \"28013\",\n Country = \"ES\",\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -30860,10 +33469,7 @@ "description": "Registry filing dates, when available. Annual returns and general meetings use last_annual_return_date and last_agm_date; they are distinct from financial accounts." }, "registry_data": { - "type": "object", - "nullable": true, - "additionalProperties": true, - "description": "Raw registry payload snapshot. Every key you PATCH is merged into this map (dates serialized as ISO strings), so the \"extracted from registry\" view reflects operator corrections." + "$ref": "#/components/schemas/KYBRegistryData" }, "user_provided_data": { "type": "object", @@ -31026,7 +33632,7 @@ } }, "403": { - "description": "Missing/invalid credentials or insufficient permissions. This API returns `403` for authentication failures — never `401`.", + "description": "Missing credentials or insufficient permissions. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -31106,12 +33712,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.patch(\n \"https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/\"\n \"88888888-9999-aaaa-bbbb-cccccccccccc/update-data/\",\n headers={\n \"x-api-key\": \"YOUR_API_KEY\",\n \"Content-Type\": \"application/json\",\n },\n json={\n \"company_name\": \"Docs Probe Corp\",\n \"registration_number\": \"DPC-001\",\n \"country_code\": \"US\",\n \"incorporation_date\": \"2015-04-12\",\n \"legal_address\": \"1 Example Plaza, Wilmington, DE 19801\",\n \"registry_status\": \"active\",\n },\n)\nresponse.raise_for_status()\ncompany = response.json() # full company record\nprint(company[\"company_name\"], company[\"registered_address\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_kyb_company_data(\n \"33333333-4444-5555-6666-777777777777\",\n \"88888888-9999-aaaa-bbbb-cccccccccccc\",\n company_name=\"Docs Probe Corp\",\n registration_number=\"DPC-001\",\n country_code=\"US\",\n incorporation_date=\"2015-04-12\",\n legal_address=\"1 Example Plaza, Wilmington, DE 19801\",\n company_type=\"Limited Liability Company\",\n registry_status=\"active\",\n verification_status=\"verified\",\n nature_of_business=\"Software development\",\n registered_capital=\"USD 50000\",\n website=\"docsprobe.example.com\",\n email=\"legal@docsprobe.example.com\",\n phone=\"+1 302 555 0143\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const response = await fetch(\n 'https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/' +\n '88888888-9999-aaaa-bbbb-cccccccccccc/update-data/',\n {\n method: 'PATCH',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n company_name: 'Docs Probe Corp',\n registration_number: 'DPC-001',\n country_code: 'US',\n incorporation_date: '2015-04-12',\n legal_address: '1 Example Plaza, Wilmington, DE 19801',\n registry_status: 'active',\n }),\n },\n);\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst company = await response.json(); // full company record" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateKybCompanyData(\n \"33333333-4444-5555-6666-777777777777\",\n \"88888888-9999-aaaa-bbbb-cccccccccccc\",\n {\n company_name: \"Docs Probe Corp\",\n registration_number: \"DPC-001\",\n country_code: \"US\",\n incorporation_date: \"2015-04-12\",\n legal_address: \"1 Example Plaza, Wilmington, DE 19801\",\n company_type: \"Limited Liability Company\",\n registry_status: \"active\",\n verification_status: \"verified\",\n nature_of_business: \"Software development\",\n registered_capital: \"USD 50000\",\n website: \"docsprobe.example.com\",\n email: \"legal@docsprobe.example.com\",\n phone: \"+1 302 555 0143\",\n },\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateKYBCompanyData(ctx, \"33333333-4444-5555-6666-777777777777\", \"88888888-9999-aaaa-bbbb-cccccccccccc\", didit.SessionsUpdateKYBCompanyDataParams{\n\tCompanyName: didit.String(\"Docs Probe Corp\"),\n\tRegistrationNumber: didit.String(\"DPC-001\"),\n\tCountryCode: didit.String(\"US\"),\n\tIncorporationDate: didit.String(\"2015-04-12\"),\n\tLegalAddress: didit.String(\"1 Example Plaza, Wilmington, DE 19801\"),\n\tCompanyType: didit.String(\"Limited Liability Company\"),\n\tRegistryStatus: didit.Some(didit.SessionsUpdateKYBCompanyDataParamsRegistryStatus(\"active\")),\n\tVerificationStatus: didit.Some(didit.SessionsUpdateKYBCompanyDataParamsVerificationStatus(\"verified\")),\n\tNatureOfBusiness: didit.String(\"Software development\"),\n\tRegisteredCapital: didit.String(\"USD 50000\"),\n\tWebsite: didit.String(\"docsprobe.example.com\"),\n\tEmail: didit.String(\"legal@docsprobe.example.com\"),\n\tPhone: didit.String(\"+1 302 555 0143\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.LocalDate;\nimport me.didit.Didit;\nimport me.didit.types.SessionsUpdateKybCompanyDataParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateKybCompanyData(\"33333333-4444-5555-6666-777777777777\", \"88888888-9999-aaaa-bbbb-cccccccccccc\", SessionsUpdateKybCompanyDataParams.builder()\n .companyName(\"Docs Probe Corp\")\n .registrationNumber(\"DPC-001\")\n .countryCode(\"US\")\n .incorporationDate(LocalDate.parse(\"2015-04-12\"))\n .legalAddress(\"1 Example Plaza, Wilmington, DE 19801\")\n .companyType(\"Limited Liability Company\")\n .registryStatus(SessionsUpdateKybCompanyDataParams.RegistryStatus.of(\"active\"))\n .verificationStatus(SessionsUpdateKybCompanyDataParams.VerificationStatus.of(\"verified\"))\n .natureOfBusiness(\"Software development\")\n .registeredCapital(\"USD 50000\")\n .website(\"docsprobe.example.com\")\n .email(\"legal@docsprobe.example.com\")\n .phone(\"+1 302 555 0143\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->updateKybCompanyData('33333333-4444-5555-6666-777777777777', '88888888-9999-aaaa-bbbb-cccccccccccc', [\n 'company_name' => 'Docs Probe Corp',\n 'registration_number' => 'DPC-001',\n 'country_code' => 'US',\n 'incorporation_date' => '2015-04-12',\n 'legal_address' => '1 Example Plaza, Wilmington, DE 19801',\n 'company_type' => 'Limited Liability Company',\n 'registry_status' => 'active',\n 'verification_status' => 'verified',\n 'nature_of_business' => 'Software development',\n 'registered_capital' => 'USD 50000',\n 'website' => 'docsprobe.example.com',\n 'email' => 'legal@docsprobe.example.com',\n 'phone' => '+1 302 555 0143',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_kyb_company_data(\n \"33333333-4444-5555-6666-777777777777\",\n \"88888888-9999-aaaa-bbbb-cccccccccccc\",\n company_name: \"Docs Probe Corp\",\n registration_number: \"DPC-001\",\n country_code: \"US\",\n incorporation_date: \"2015-04-12\",\n legal_address: \"1 Example Plaza, Wilmington, DE 19801\",\n company_type: \"Limited Liability Company\",\n registry_status: \"active\",\n verification_status: \"verified\",\n nature_of_business: \"Software development\",\n registered_capital: \"USD 50000\",\n website: \"docsprobe.example.com\",\n email: \"legal@docsprobe.example.com\",\n phone: \"+1 302 555 0143\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateKybCompanyDataAsync(\"33333333-4444-5555-6666-777777777777\", \"88888888-9999-aaaa-bbbb-cccccccccccc\", new SessionsUpdateKybCompanyDataParams\n{\n CompanyName = \"Docs Probe Corp\",\n RegistrationNumber = \"DPC-001\",\n CountryCode = \"US\",\n IncorporationDate = \"2015-04-12\",\n LegalAddress = \"1 Example Plaza, Wilmington, DE 19801\",\n CompanyType = \"Limited Liability Company\",\n RegistryStatus = new SessionsUpdateKybCompanyDataParamsRegistryStatus(\"active\"),\n VerificationStatus = new SessionsUpdateKybCompanyDataParamsVerificationStatus(\"verified\"),\n NatureOfBusiness = \"Software development\",\n RegisteredCapital = \"USD 50000\",\n Website = \"docsprobe.example.com\",\n Email = \"legal@docsprobe.example.com\",\n Phone = \"+1 302 555 0143\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -31270,7 +33901,7 @@ } }, "403": { - "description": "Missing/invalid credentials or insufficient permissions. This API returns `403` for authentication failures — never `401`.", + "description": "Missing credentials or insufficient permissions. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "examples": { @@ -31334,7 +33965,44 @@ } } } - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_kyb_party(\n \"33333333-4444-5555-6666-777777777777\",\n \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\",\n is_skipped=True,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateKybParty(\n \"33333333-4444-5555-6666-777777777777\",\n \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\",\n {\n is_skipped: true,\n },\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateKYBParty(ctx, \"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\", didit.SessionsUpdateKYBPartyParams{\n\tIsSkipped: true,\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateKybPartyParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateKybParty(\"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\", SessionsUpdateKybPartyParams.builder()\n .isSkipped(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->updateKybParty('33333333-4444-5555-6666-777777777777', '0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41', [\n 'is_skipped' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_kyb_party(\n \"33333333-4444-5555-6666-777777777777\",\n \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\",\n is_skipped: true\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateKybPartyAsync(\"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\", new SessionsUpdateKybPartyParams\n{\n IsSkipped = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/travel-rule/settings/": { @@ -31361,6 +34029,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/travel-rule/settings/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.retrieve_settings()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.retrieveSettings();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RetrieveSettings(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().retrieveSettings();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->retrieveSettings();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.retrieve_settings\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.RetrieveSettingsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -31504,6 +34207,41 @@ "lang": "curl", "label": "curl", "source": "curl -X PUT https://verification.didit.me/v3/travel-rule/settings/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"is_enabled\": true, \"legal_name\": \"Origin CASP SL\", \"jurisdiction\": \"EU\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.update_settings(\n is_enabled=True,\n legal_name=\"Origin CASP SL\",\n jurisdiction=\"EU\",\n name_matching_strictness=\"DEFAULT\",\n confirmation_timeout_hours=48,\n timeout_outcome=\"HOLD\",\n is_discoverable=True,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.updateSettings({\n is_enabled: true,\n legal_name: \"Origin CASP SL\",\n jurisdiction: \"EU\",\n name_matching_strictness: \"DEFAULT\",\n confirmation_timeout_hours: 48,\n timeout_outcome: \"HOLD\",\n is_discoverable: true,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.UpdateSettings(ctx, didit.TravelRuleSettingsUpdate{\n\tIsEnabled: didit.Bool(true),\n\tLegalName: didit.String(\"Origin CASP SL\"),\n\tJurisdiction: didit.String(\"EU\"),\n\tNameMatchingStrictness: didit.Some(didit.TravelRuleSettingsUpdateNameMatchingStrictness(\"DEFAULT\")),\n\tConfirmationTimeoutHours: didit.Int(48),\n\tTimeoutOutcome: didit.Some(didit.TravelRuleSettingsUpdateTimeoutOutcome(\"HOLD\")),\n\tIsDiscoverable: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleSettingsUpdate;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().updateSettings(TravelRuleSettingsUpdate.builder()\n .isEnabled(true)\n .legalName(\"Origin CASP SL\")\n .jurisdiction(\"EU\")\n .nameMatchingStrictness(TravelRuleSettingsUpdate.NameMatchingStrictness.of(\"DEFAULT\"))\n .confirmationTimeoutHours(48L)\n .timeoutOutcome(TravelRuleSettingsUpdate.TimeoutOutcome.of(\"HOLD\"))\n .isDiscoverable(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->updateSettings([\n 'is_enabled' => true,\n 'legal_name' => 'Origin CASP SL',\n 'jurisdiction' => 'EU',\n 'name_matching_strictness' => 'DEFAULT',\n 'confirmation_timeout_hours' => 48,\n 'timeout_outcome' => 'HOLD',\n 'is_discoverable' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.update_settings(\n is_enabled: true,\n legal_name: \"Origin CASP SL\",\n jurisdiction: \"EU\",\n name_matching_strictness: \"DEFAULT\",\n confirmation_timeout_hours: 48,\n timeout_outcome: \"HOLD\",\n is_discoverable: true\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.UpdateSettingsAsync(new TravelRuleSettingsUpdate\n{\n IsEnabled = true,\n LegalName = \"Origin CASP SL\",\n Jurisdiction = \"EU\",\n NameMatchingStrictness = new TravelRuleSettingsUpdateNameMatchingStrictness(\"DEFAULT\"),\n ConfirmationTimeoutHours = 48,\n TimeoutOutcome = new TravelRuleSettingsUpdateTimeoutOutcome(\"HOLD\"),\n IsDiscoverable = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -31559,6 +34297,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/settings/compliance-email/confirmation/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.send_compliance_email_confirmation()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.sendComplianceEmailConfirmation();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.SendComplianceEmailConfirmation(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().sendComplianceEmailConfirmation();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->sendComplianceEmailConfirmation();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.send_compliance_email_confirmation\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.SendComplianceEmailConfirmationAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -31666,6 +34439,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/travel-rule/wallet-addresses/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.wallet_addresses.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.walletAddresses.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.WalletAddresses.ListAutoPaging(ctx, didit.TravelRuleWalletAddressesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().walletAddresses().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->walletAddresses->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.wallet_addresses.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.WalletAddresses.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -31740,6 +34548,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/wallet-addresses/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"address\": \"0xBeneficiaryWallet01\", \"chain\": \"ETH\", \"holder_name\": \"Ana Diaz\", \"self_declared\": true}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.wallet_addresses.create(\n address=\"0xBeneficiaryWallet01\",\n chain=\"ETH\",\n holder_vendor_data=\"user-042\",\n holder_name=\"Ana Diaz\",\n self_declared=True,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.walletAddresses.create({\n address: \"0xBeneficiaryWallet01\",\n chain: \"ETH\",\n holder_vendor_data: \"user-042\",\n holder_name: \"Ana Diaz\",\n self_declared: true,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.WalletAddresses.Create(ctx, didit.WalletAddressEntryCreate{\n\tAddress: \"0xBeneficiaryWallet01\",\n\tChain: didit.String(\"ETH\"),\n\tHolderVendorData: didit.String(\"user-042\"),\n\tHolderName: didit.String(\"Ana Diaz\"),\n\tSelfDeclared: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.WalletAddressEntryCreate;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().walletAddresses().create(WalletAddressEntryCreate.builder()\n .address(\"0xBeneficiaryWallet01\")\n .chain(\"ETH\")\n .holderVendorData(\"user-042\")\n .holderName(\"Ana Diaz\")\n .selfDeclared(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->walletAddresses->create([\n 'address' => '0xBeneficiaryWallet01',\n 'chain' => 'ETH',\n 'holder_vendor_data' => 'user-042',\n 'holder_name' => 'Ana Diaz',\n 'self_declared' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.wallet_addresses.create(\n address: \"0xBeneficiaryWallet01\",\n chain: \"ETH\",\n holder_vendor_data: \"user-042\",\n holder_name: \"Ana Diaz\",\n self_declared: true\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.WalletAddresses.CreateAsync(new WalletAddressEntryCreate\n{\n Address = \"0xBeneficiaryWallet01\",\n Chain = \"ETH\",\n HolderVendorData = \"user-042\",\n HolderName = \"Ana Diaz\",\n SelfDeclared = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -31838,6 +34681,41 @@ "lang": "curl", "label": "curl", "source": "curl -X PATCH https://verification.didit.me/v3/travel-rule/wallet-addresses/{entry_uuid}/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"holder_name\": \"Ana Updated\", \"travel_address\": \"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.wallet_addresses.update(\n \"11111111-2222-3333-4444-555555555555\",\n holder_name=\"Ana Updated\",\n travel_address=\"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.walletAddresses.update(\"11111111-2222-3333-4444-555555555555\", {\n holder_name: \"Ana Updated\",\n travel_address: \"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.WalletAddresses.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.WalletAddressEntryUpdateParam{\n\tHolderName: didit.String(\"Ana Updated\"),\n\tTravelAddress: didit.String(\"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.WalletAddressEntryUpdate;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().walletAddresses().update(\"11111111-2222-3333-4444-555555555555\", WalletAddressEntryUpdate.builder()\n .holderName(\"Ana Updated\")\n .travelAddress(\"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->walletAddresses->update('11111111-2222-3333-4444-555555555555', [\n 'holder_name' => 'Ana Updated',\n 'travel_address' => 'ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.wallet_addresses.update(\n \"11111111-2222-3333-4444-555555555555\",\n holder_name: \"Ana Updated\",\n travel_address: \"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.WalletAddresses.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new WalletAddressEntryUpdate\n{\n HolderName = \"Ana Updated\",\n TravelAddress = \"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -31906,6 +34784,41 @@ "lang": "curl", "label": "curl", "source": "curl -X DELETE https://verification.didit.me/v3/travel-rule/wallet-addresses/{entry_uuid}/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.travel_rule.wallet_addresses.delete(\n \"11111111-2222-3333-4444-555555555555\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.travelRule.walletAddresses.delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.TravelRule.WalletAddresses.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.travelRule().walletAddresses().delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->walletAddresses->delete('11111111-2222-3333-4444-555555555555');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.wallet_addresses.delete(\"11111111-2222-3333-4444-555555555555\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.TravelRule.WalletAddresses.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");" } ], "responses": { @@ -32045,6 +34958,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/travel-rule/vasps/?search=counterparty&reachable=true' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.list_vasps():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.listVasps()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.ListVASPsAutoPaging(ctx, didit.TravelRuleListVASPsParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().listVasps()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->listVasps() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.list_vasps.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.ListVaspsAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -32146,6 +35094,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.retrieve_vasp(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.retrieveVasp(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RetrieveVASP(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().retrieveVasp(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->retrieveVasp('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.retrieve_vasp(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.RetrieveVaspAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -32216,6 +35199,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/decision/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.retrieve_vasp_decision(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.retrieveVaspDecision(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RetrieveVASPDecision(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().retrieveVaspDecision(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->retrieveVaspDecision('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.retrieve_vasp_decision(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.RetrieveVaspDecisionAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -32330,6 +35348,41 @@ "lang": "curl", "label": "curl", "source": "curl -X PUT https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/decision/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"decision\": \"BLOCKED\", \"reason\": \"Unlicensed in its home jurisdiction\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.update_vasp_decision(\n \"11111111-2222-3333-4444-555555555555\",\n decision=\"BLOCKED\",\n reason=\"Unlicensed in its home jurisdiction\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.updateVaspDecision(\"11111111-2222-3333-4444-555555555555\", {\n decision: \"BLOCKED\",\n reason: \"Unlicensed in its home jurisdiction\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.UpdateVASPDecision(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleCounterpartyDecisionRequest{\n\tDecision: \"BLOCKED\",\n\tReason: didit.String(\"Unlicensed in its home jurisdiction\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleCounterpartyDecisionRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().updateVaspDecision(\"11111111-2222-3333-4444-555555555555\", TravelRuleCounterpartyDecisionRequest.builder()\n .decision(TravelRuleCounterpartyDecisionRequest.Decision.of(\"BLOCKED\"))\n .reason(\"Unlicensed in its home jurisdiction\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->updateVaspDecision('11111111-2222-3333-4444-555555555555', [\n 'decision' => 'BLOCKED',\n 'reason' => 'Unlicensed in its home jurisdiction',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.update_vasp_decision(\n \"11111111-2222-3333-4444-555555555555\",\n decision: \"BLOCKED\",\n reason: \"Unlicensed in its home jurisdiction\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.UpdateVaspDecisionAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleCounterpartyDecisionRequest\n{\n Decision = \"BLOCKED\",\n Reason = \"Unlicensed in its home jurisdiction\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -32428,6 +35481,41 @@ "lang": "curl", "label": "curl", "source": "curl -X DELETE https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/decision/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.clear_vasp_decision(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.clearVaspDecision(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.ClearVASPDecision(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().clearVaspDecision(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->clearVaspDecision('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.clear_vasp_decision(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.ClearVaspDecisionAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -32510,6 +35598,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/screening/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.retrieve_vasp_screening(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.retrieveVaspScreening(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RetrieveVASPScreening(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().retrieveVaspScreening(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->retrieveVaspScreening('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.retrieve_vasp_screening(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.RetrieveVaspScreeningAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -32623,6 +35746,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/screening/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"refresh\": false}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.screen_vasp(\n \"11111111-2222-3333-4444-555555555555\",\n refresh=False,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.screenVasp(\"11111111-2222-3333-4444-555555555555\", {\n refresh: false,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.ScreenVASP(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleCounterpartyScreeningRequest{\n\tRefresh: didit.Bool(false),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleCounterpartyScreeningRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().screenVasp(\"11111111-2222-3333-4444-555555555555\", TravelRuleCounterpartyScreeningRequest.builder()\n .refresh(false)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->screenVasp('11111111-2222-3333-4444-555555555555', [\n 'refresh' => false,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.screen_vasp(\n \"11111111-2222-3333-4444-555555555555\",\n refresh: false\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.ScreenVaspAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleCounterpartyScreeningRequest\n{\n Refresh = false,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -32820,6 +35978,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/questionnaires/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.list_vasp_questionnaires(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.listVaspQuestionnaires(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.ListVASPQuestionnaires(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().listVaspQuestionnaires(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->listVaspQuestionnaires('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.list_vasp_questionnaires(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.ListVaspQuestionnairesAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -32942,6 +36135,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/questionnaires/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"sent_to\": \"travelrule@counterparty.example\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.send_vasp_questionnaire(\n \"11111111-2222-3333-4444-555555555555\",\n sent_to=\"travelrule@counterparty.example\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.sendVaspQuestionnaire(\"11111111-2222-3333-4444-555555555555\", {\n sent_to: \"travelrule@counterparty.example\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.SendVASPQuestionnaire(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleCounterpartyQuestionnaireRequest{\n\tSentTo: didit.String(\"travelrule@counterparty.example\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleCounterpartyQuestionnaireRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().sendVaspQuestionnaire(\"11111111-2222-3333-4444-555555555555\", TravelRuleCounterpartyQuestionnaireRequest.builder()\n .sentTo(\"travelrule@counterparty.example\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->sendVaspQuestionnaire('11111111-2222-3333-4444-555555555555', [\n 'sent_to' => 'travelrule@counterparty.example',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.send_vasp_questionnaire(\n \"11111111-2222-3333-4444-555555555555\",\n sent_to: \"travelrule@counterparty.example\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.SendVaspQuestionnaireAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleCounterpartyQuestionnaireRequest\n{\n SentTo = \"travelrule@counterparty.example\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -33107,6 +36335,41 @@ "lang": "curl", "label": "curl", "source": "curl -X PATCH https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"payment_txn_id\": \"0xchainhash\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.travel_rule.update_transfer(\n \"11111111-2222-3333-4444-555555555555\",\n payment_txn_id=\"0xchainhash\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.travelRule.updateTransfer(\"11111111-2222-3333-4444-555555555555\", {\n payment_txn_id: \"0xchainhash\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.UpdateTransfer(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleTransferPatchRequest{\n\tPaymentTxnID: didit.String(\"0xchainhash\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleTransferPatchRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().travelRule().updateTransfer(\"11111111-2222-3333-4444-555555555555\", TravelRuleTransferPatchRequest.builder()\n .paymentTxnId(\"0xchainhash\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->travelRule->updateTransfer('11111111-2222-3333-4444-555555555555', [\n 'payment_txn_id' => '0xchainhash',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.travel_rule.update_transfer(\n \"11111111-2222-3333-4444-555555555555\",\n payment_txn_id: \"0xchainhash\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.TravelRule.UpdateTransferAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleTransferPatchRequest\n{\n PaymentTxnId = \"0xchainhash\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -33227,6 +36490,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/ownership/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"confirmed\": true}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.travel_rule.confirm_ownership(\n \"11111111-2222-3333-4444-555555555555\",\n confirmed=True,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.travelRule.confirmOwnership(\"11111111-2222-3333-4444-555555555555\", {\n confirmed: true,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.ConfirmOwnership(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleOwnershipConfirmRequest{\n\tConfirmed: true,\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleOwnershipConfirmRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().travelRule().confirmOwnership(\"11111111-2222-3333-4444-555555555555\", TravelRuleOwnershipConfirmRequest.builder()\n .confirmed(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->travelRule->confirmOwnership('11111111-2222-3333-4444-555555555555', [\n 'confirmed' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.travel_rule.confirm_ownership(\n \"11111111-2222-3333-4444-555555555555\",\n confirmed: true\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.TravelRule.ConfirmOwnershipAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleOwnershipConfirmRequest\n{\n Confirmed = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -33331,6 +36629,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/messages/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.travel_rule.list_messages(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.travelRule.listMessages(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.ListMessages(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().travelRule().listMessages(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->travelRule->listMessages('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.travel_rule.list_messages(\"11111111-2222-3333-4444-555555555555\").each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.TravelRule.ListMessagesAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -33409,6 +36742,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/messages/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"kind\": \"DOCUMENT_REQUEST\", \"body\": \"Please confirm the date of birth of the beneficiary.\", \"requested_documents\": [\"Proof of address\"]}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.travel_rule.create_message(\n \"11111111-2222-3333-4444-555555555555\",\n kind=\"DOCUMENT_REQUEST\",\n body=\"Please confirm the date of birth of the beneficiary.\",\n requested_documents=[\"Proof of address\"],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.travelRule.createMessage(\"11111111-2222-3333-4444-555555555555\", {\n kind: \"DOCUMENT_REQUEST\",\n body: \"Please confirm the date of birth of the beneficiary.\",\n requested_documents: [\"Proof of address\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.CreateMessage(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleMessageCreateRequest{\n\tKind: didit.Some(didit.TravelRuleMessageCreateRequestKind(\"DOCUMENT_REQUEST\")),\n\tBody: didit.String(\"Please confirm the date of birth of the beneficiary.\"),\n\tRequestedDocuments: didit.Some([]string{\"Proof of address\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.TravelRuleMessageCreateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().travelRule().createMessage(\"11111111-2222-3333-4444-555555555555\", TravelRuleMessageCreateRequest.builder()\n .kind(TravelRuleMessageCreateRequest.Kind.of(\"DOCUMENT_REQUEST\"))\n .body(\"Please confirm the date of birth of the beneficiary.\")\n .requestedDocuments(List.of(\"Proof of address\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->travelRule->createMessage('11111111-2222-3333-4444-555555555555', [\n 'kind' => 'DOCUMENT_REQUEST',\n 'body' => 'Please confirm the date of birth of the beneficiary.',\n 'requested_documents' => ['Proof of address'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.travel_rule.create_message(\n \"11111111-2222-3333-4444-555555555555\",\n kind: \"DOCUMENT_REQUEST\",\n body: \"Please confirm the date of birth of the beneficiary.\",\n requested_documents: [\"Proof of address\"]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.TravelRule.CreateMessageAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleMessageCreateRequest\n{\n Kind = new TravelRuleMessageCreateRequestKind(\"DOCUMENT_REQUEST\"),\n Body = \"Please confirm the date of birth of the beneficiary.\",\n RequestedDocuments = new string[] { \"Proof of address\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -33911,6 +37279,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/inbound/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"chain\":\"ETH\",\"txid\":\"0xdeposit-hash\",\"wallet_address\":\"0xYourDepositWallet\",\"amount\":\"500.00\",\"currency\":\"USDC\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.register_inbound(\n chain=\"ETH\",\n txid=\"0xdeposit-hash\",\n wallet_address=\"0xYourDepositWallet\",\n amount=\"500.00\",\n currency=\"USDC\",\n originator_data={\"name\": \"Origin CASP SL\"},\n beneficiary_data={\"name\": \"Ana Diaz\"},\n originating_vasp={\n \"name\": \"Origin CASP SL\",\n \"lei\": \"\",\n \"travel_address\": \"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\",\n },\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.registerInbound({\n chain: \"ETH\",\n txid: \"0xdeposit-hash\",\n wallet_address: \"0xYourDepositWallet\",\n amount: \"500.00\",\n currency: \"USDC\",\n originator_data: { name: \"Origin CASP SL\" },\n beneficiary_data: { name: \"Ana Diaz\" },\n originating_vasp: {\n name: \"Origin CASP SL\",\n lei: \"\",\n travel_address: \"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\",\n },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RegisterInbound(ctx, didit.TravelRuleInboundRequest{\n\tChain: \"ETH\",\n\tTxid: \"0xdeposit-hash\",\n\tWalletAddress: \"0xYourDepositWallet\",\n\tAmount: \"500.00\",\n\tCurrency: \"USDC\",\n\tOriginatorData: didit.Some(map[string]any{\"name\": \"Origin CASP SL\"}),\n\tBeneficiaryData: didit.Some(map[string]any{\"name\": \"Ana Diaz\"}),\n\tOriginatingVASP: didit.Some(didit.TravelRuleInboundRequestOriginatingVASP{\n\t\tName: didit.String(\"Origin CASP SL\"),\n\t\tLei: didit.String(\"\"),\n\t\tTravelAddress: didit.String(\"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.TravelRuleInboundRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().registerInbound(TravelRuleInboundRequest.builder()\n .chain(\"ETH\")\n .txid(\"0xdeposit-hash\")\n .walletAddress(\"0xYourDepositWallet\")\n .amount(\"500.00\")\n .currency(\"USDC\")\n .originatorData(Map.of(\"name\", \"Origin CASP SL\"))\n .beneficiaryData(Map.of(\"name\", \"Ana Diaz\"))\n .originatingVasp(TravelRuleInboundRequest.OriginatingVasp.builder()\n .name(\"Origin CASP SL\")\n .lei(\"\")\n .travelAddress(\"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\")\n .build())\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->registerInbound([\n 'chain' => 'ETH',\n 'txid' => '0xdeposit-hash',\n 'wallet_address' => '0xYourDepositWallet',\n 'amount' => '500.00',\n 'currency' => 'USDC',\n 'originator_data' => ['name' => 'Origin CASP SL'],\n 'beneficiary_data' => ['name' => 'Ana Diaz'],\n 'originating_vasp' => [\n 'name' => 'Origin CASP SL',\n 'lei' => '',\n 'travel_address' => 'ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC',\n ],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.register_inbound(\n chain: \"ETH\",\n txid: \"0xdeposit-hash\",\n wallet_address: \"0xYourDepositWallet\",\n amount: \"500.00\",\n currency: \"USDC\",\n originator_data: { name: \"Origin CASP SL\" },\n beneficiary_data: { name: \"Ana Diaz\" },\n originating_vasp: {\n name: \"Origin CASP SL\",\n lei: \"\",\n travel_address: \"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\",\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.RegisterInboundAsync(new TravelRuleInboundRequest\n{\n Chain = \"ETH\",\n Txid = \"0xdeposit-hash\",\n WalletAddress = \"0xYourDepositWallet\",\n Amount = \"500.00\",\n Currency = \"USDC\",\n OriginatorData = new Dictionary { [\"name\"] = \"Origin CASP SL\" },\n BeneficiaryData = new Dictionary { [\"name\"] = \"Ana Diaz\" },\n OriginatingVasp = new TravelRuleInboundRequestOriginatingVasp\n {\n Name = \"Origin CASP SL\",\n Lei = \"\",\n TravelAddress = \"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\",\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -34002,6 +37405,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/test-vasp/inbound/ \\\n -H 'x-api-key: YOUR_SANDBOX_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"beneficiary_wallet_address\":\"0xYourSandboxWallet\",\"scenario\":\"accept\",\"reference\":\"demo-001\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.travel_rule.trigger_test_vasp_inbound(\n beneficiary_wallet_address=\"0xYourSandboxWallet\",\n scenario=\"accept\",\n amount=\"1\",\n reference=\"demo-001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.travelRule.triggerTestVaspInbound({\n beneficiary_wallet_address: \"0xYourSandboxWallet\",\n scenario: \"accept\",\n amount: \"1\",\n reference: \"demo-001\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.TriggerTestVASPInbound(ctx, didit.TravelRuleTestVASPInboundRequest{\n\tBeneficiaryWalletAddress: \"0xYourSandboxWallet\",\n\tScenario: didit.Some(didit.TravelRuleTestVASPInboundRequestScenario(\"accept\")),\n\tAmount: didit.String(\"1\"),\n\tReference: didit.String(\"demo-001\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleTestVaspInboundRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().travelRule().triggerTestVaspInbound(TravelRuleTestVaspInboundRequest.builder()\n .beneficiaryWalletAddress(\"0xYourSandboxWallet\")\n .scenario(TravelRuleTestVaspInboundRequest.Scenario.of(\"accept\"))\n .amount(\"1\")\n .reference(\"demo-001\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->travelRule->triggerTestVaspInbound([\n 'beneficiary_wallet_address' => '0xYourSandboxWallet',\n 'scenario' => 'accept',\n 'amount' => '1',\n 'reference' => 'demo-001',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.travel_rule.trigger_test_vasp_inbound(\n beneficiary_wallet_address: \"0xYourSandboxWallet\",\n scenario: \"accept\",\n amount: \"1\",\n reference: \"demo-001\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.TravelRule.TriggerTestVaspInboundAsync(new TravelRuleTestVaspInboundRequest\n{\n BeneficiaryWalletAddress = \"0xYourSandboxWallet\",\n Scenario = new TravelRuleTestVaspInboundRequestScenario(\"accept\"),\n Amount = \"1\",\n Reference = \"demo-001\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -34085,6 +37523,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/widget-session/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"wallet_address\":\"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\",\"chain\":\"ETH\",\"holder_name\":\"Jane Doe\",\"transaction_id\":\"99999999-aaaa-bbbb-cccc-dddddddddddd\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.create_widget_session(\n wallet_address=\"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\",\n chain=\"ETH\",\n holder_name=\"Jane Doe\",\n vendor_data=\"user-042\",\n transaction_id=\"99999999-aaaa-bbbb-cccc-dddddddddddd\",\n expires_in_minutes=60,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.createWidgetSession({\n wallet_address: \"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\",\n chain: \"ETH\",\n holder_name: \"Jane Doe\",\n vendor_data: \"user-042\",\n transaction_id: \"99999999-aaaa-bbbb-cccc-dddddddddddd\",\n expires_in_minutes: 60,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.CreateWidgetSession(ctx, didit.TravelRuleWidgetSessionCreate{\n\tWalletAddress: didit.String(\"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\"),\n\tChain: didit.String(\"ETH\"),\n\tHolderName: didit.String(\"Jane Doe\"),\n\tVendorData: didit.String(\"user-042\"),\n\tTransactionID: didit.String(\"99999999-aaaa-bbbb-cccc-dddddddddddd\"),\n\tExpiresInMinutes: didit.Int(60),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleWidgetSessionCreate;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().createWidgetSession(TravelRuleWidgetSessionCreate.builder()\n .walletAddress(\"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\")\n .chain(\"ETH\")\n .holderName(\"Jane Doe\")\n .vendorData(\"user-042\")\n .transactionId(\"99999999-aaaa-bbbb-cccc-dddddddddddd\")\n .expiresInMinutes(60L)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->createWidgetSession([\n 'wallet_address' => '0xd3b62acb76fb27a7f8961ec40fa11746b113aca9',\n 'chain' => 'ETH',\n 'holder_name' => 'Jane Doe',\n 'vendor_data' => 'user-042',\n 'transaction_id' => '99999999-aaaa-bbbb-cccc-dddddddddddd',\n 'expires_in_minutes' => 60,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.create_widget_session(\n wallet_address: \"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\",\n chain: \"ETH\",\n holder_name: \"Jane Doe\",\n vendor_data: \"user-042\",\n transaction_id: \"99999999-aaaa-bbbb-cccc-dddddddddddd\",\n expires_in_minutes: 60\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.CreateWidgetSessionAsync(new TravelRuleWidgetSessionCreate\n{\n WalletAddress = \"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\",\n Chain = \"ETH\",\n HolderName = \"Jane Doe\",\n VendorData = \"user-042\",\n TransactionId = \"99999999-aaaa-bbbb-cccc-dddddddddddd\",\n ExpiresInMinutes = 60,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -34504,6 +37977,12 @@ "application/json": { "schema": { "$ref": "#/components/schemas/OngoingMonitoringToggleRequest" + }, + "example": { + "is_enabled": true, + "didit_internal_id_list": [ + "5b9a0000-0000-4000-8000-00000000f00d" + ] } } } @@ -34537,6 +38016,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.users.set_ongoing_monitoring(\n is_enabled=True,\n didit_internal_id_list=[\"5b9a0000-0000-4000-8000-00000000f00d\"],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.users.setOngoingMonitoring({\n is_enabled: true,\n didit_internal_id_list: [\"5b9a0000-0000-4000-8000-00000000f00d\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Users.SetOngoingMonitoring(ctx, didit.OngoingMonitoringToggleRequest{\n\tIsEnabled: true,\n\tDiditInternalIDList: didit.Some([]string{\"5b9a0000-0000-4000-8000-00000000f00d\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.OngoingMonitoringToggleRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.users().setOngoingMonitoring(OngoingMonitoringToggleRequest.builder()\n .isEnabled(true)\n .diditInternalIdList(List.of(\"5b9a0000-0000-4000-8000-00000000f00d\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->setOngoingMonitoring([\n 'is_enabled' => true,\n 'didit_internal_id_list' => ['5b9a0000-0000-4000-8000-00000000f00d'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.users.set_ongoing_monitoring(\n is_enabled: true,\n didit_internal_id_list: [\"5b9a0000-0000-4000-8000-00000000f00d\"]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Users.SetOngoingMonitoringAsync(new OngoingMonitoringToggleRequest\n{\n IsEnabled = true,\n DiditInternalIdList = new string[] { \"5b9a0000-0000-4000-8000-00000000f00d\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -34606,6 +38122,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.users.retrieve_ongoing_monitoring_job(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.users.retrieveOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Users.RetrieveOngoingMonitoringJob(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.users().retrieveOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->retrieveOngoingMonitoringJob('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.users.retrieve_ongoing_monitoring_job(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Users.RetrieveOngoingMonitoringJobAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -34652,6 +38205,12 @@ "application/json": { "schema": { "$ref": "#/components/schemas/OngoingMonitoringToggleRequest" + }, + "example": { + "is_enabled": true, + "didit_internal_id_list": [ + "b0000000-0000-4000-8000-0000000000b1" + ] } } } @@ -34685,6 +38244,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.businesses.set_ongoing_monitoring(\n is_enabled=True,\n didit_internal_id_list=[\"b0000000-0000-4000-8000-0000000000b1\"],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businesses.setOngoingMonitoring({\n is_enabled: true,\n didit_internal_id_list: [\"b0000000-0000-4000-8000-0000000000b1\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.SetOngoingMonitoring(ctx, didit.OngoingMonitoringToggleRequest{\n\tIsEnabled: true,\n\tDiditInternalIDList: didit.Some([]string{\"b0000000-0000-4000-8000-0000000000b1\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.OngoingMonitoringToggleRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businesses().setOngoingMonitoring(OngoingMonitoringToggleRequest.builder()\n .isEnabled(true)\n .diditInternalIdList(List.of(\"b0000000-0000-4000-8000-0000000000b1\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->setOngoingMonitoring([\n 'is_enabled' => true,\n 'didit_internal_id_list' => ['b0000000-0000-4000-8000-0000000000b1'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.businesses.set_ongoing_monitoring(\n is_enabled: true,\n didit_internal_id_list: [\"b0000000-0000-4000-8000-0000000000b1\"]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.SetOngoingMonitoringAsync(new OngoingMonitoringToggleRequest\n{\n IsEnabled = true,\n DiditInternalIdList = new string[] { \"b0000000-0000-4000-8000-0000000000b1\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -34754,6 +38350,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.businesses.retrieve_ongoing_monitoring_job(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businesses.retrieveOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.RetrieveOngoingMonitoringJob(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businesses().retrieveOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->retrieveOngoingMonitoringJob('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.businesses.retrieve_ongoing_monitoring_job(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.RetrieveOngoingMonitoringJobAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -34854,6 +38487,13 @@ "type": "string" } } + }, + "example": { + "is_enabled": true, + "session_numbers": [ + "1001", + "1002" + ] } } } @@ -34887,6 +38527,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.businesses.set_session_ongoing_monitoring(\n is_enabled=True,\n session_numbers=[\"1001\", \"1002\"],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businesses.setSessionOngoingMonitoring({\n is_enabled: true,\n session_numbers: [\"1001\", \"1002\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.SetSessionOngoingMonitoring(ctx, didit.BusinessesSetSessionOngoingMonitoringParams{\n\tIsEnabled: true,\n\tSessionNumbers: didit.Some([]string{\"1001\", \"1002\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.BusinessesSetSessionOngoingMonitoringParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businesses().setSessionOngoingMonitoring(BusinessesSetSessionOngoingMonitoringParams.builder()\n .isEnabled(true)\n .sessionNumbers(List.of(\"1001\", \"1002\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->setSessionOngoingMonitoring([\n 'is_enabled' => true,\n 'session_numbers' => ['1001', '1002'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.businesses.set_session_ongoing_monitoring(\n is_enabled: true,\n session_numbers: [\"1001\", \"1002\"]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.SetSessionOngoingMonitoringAsync(new BusinessesSetSessionOngoingMonitoringParams\n{\n IsEnabled = true,\n SessionNumbers = new string[] { \"1001\", \"1002\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -34956,6 +38633,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.businesses.retrieve_session_ongoing_monitoring_job(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businesses.retrieveSessionOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.RetrieveSessionOngoingMonitoringJob(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businesses().retrieveSessionOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->retrieveSessionOngoingMonitoringJob('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.businesses.retrieve_session_ongoing_monitoring_job(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.RetrieveSessionOngoingMonitoringJobAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -35141,7 +38855,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'status__in': 'OPEN,AWAITING_USER', 'ordering': '-due_at'},\n timeout=10,\n)\nresp.raise_for_status()\nfor case in resp.json()['results']:\n print(case['case_number'], case['title'], case['priority'], case['due_at'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.ListAutoPaging(ctx, didit.CasesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -35303,6 +39047,18 @@ "$ref": "#/components/schemas/CaseDuplicateCaseFraudSourceContextRequest" } } + }, + "example": { + "title": "Manual - Jane Doe", + "blueprint": "b1de0000-0000-4000-8000-000000000002", + "priority": "HIGH", + "subject": { + "type": "user", + "uuid": "5b9a0000-0000-4000-8000-00000000f00d" + }, + "tags": [ + "review" + ] } } } @@ -35316,7 +39072,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={\n 'title': 'Manual - Jane Doe',\n 'blueprint': 'b1de0000-0000-4000-8000-000000000002',\n 'priority': 'HIGH',\n 'subject': {'type': 'user', 'uuid': '5b9a0000-0000-4000-8000-00000000f00d'},\n },\n timeout=10,\n)\nresp.raise_for_status()\ncase = resp.json()\nprint(case['case_number'], case['uuid'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.create(\n title=\"Manual - Jane Doe\",\n blueprint=\"b1de0000-0000-4000-8000-000000000002\",\n priority=\"HIGH\",\n tags=[\"review\"],\n subject={\n \"type\": \"user\",\n \"uuid\": \"5b9a0000-0000-4000-8000-00000000f00d\",\n },\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.create({\n title: \"Manual - Jane Doe\",\n blueprint: \"b1de0000-0000-4000-8000-000000000002\",\n priority: \"HIGH\",\n tags: [\"review\"],\n subject: {\n type: \"user\",\n uuid: \"5b9a0000-0000-4000-8000-00000000f00d\",\n },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Create(ctx, didit.CasesCreateParams{\n\tTitle: \"Manual - Jane Doe\",\n\tBlueprint: didit.String(\"b1de0000-0000-4000-8000-000000000002\"),\n\tPriority: didit.Some(didit.CasesCreateParamsPriority(\"HIGH\")),\n\tTags: didit.Some([]string{\"review\"}),\n\tSubject: didit.Some(didit.CasesCreateParamsSubject{\n\t\tType: didit.Some(didit.CasesCreateParamsSubjectType(\"user\")),\n\t\tUUID: didit.String(\"5b9a0000-0000-4000-8000-00000000f00d\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CasesCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().create(CasesCreateParams.builder()\n .title(\"Manual - Jane Doe\")\n .blueprint(\"b1de0000-0000-4000-8000-000000000002\")\n .priority(CasesCreateParams.Priority.of(\"HIGH\"))\n .tags(List.of(\"review\"))\n .subject(CasesCreateParams.Subject.builder()\n .type(CasesCreateParams.Subject.Type.of(\"user\"))\n .uuid(\"5b9a0000-0000-4000-8000-00000000f00d\")\n .build())\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->create([\n 'title' => 'Manual - Jane Doe',\n 'blueprint' => 'b1de0000-0000-4000-8000-000000000002',\n 'priority' => 'HIGH',\n 'tags' => ['review'],\n 'subject' => [\n 'type' => 'user',\n 'uuid' => '5b9a0000-0000-4000-8000-00000000f00d',\n ],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.create(\n title: \"Manual - Jane Doe\",\n blueprint: \"b1de0000-0000-4000-8000-000000000002\",\n priority: \"HIGH\",\n tags: [\"review\"],\n subject: {\n type: \"user\",\n uuid: \"5b9a0000-0000-4000-8000-00000000f00d\",\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.CreateAsync(new CasesCreateParams\n{\n Title = \"Manual - Jane Doe\",\n Blueprint = \"b1de0000-0000-4000-8000-000000000002\",\n Priority = new CasesCreateParamsPriority(\"HIGH\"),\n Tags = new string[] { \"review\" },\n Subject = new CasesCreateParamsSubject\n {\n Type = new CasesCreateParamsSubjectType(\"user\"),\n Uuid = \"5b9a0000-0000-4000-8000-00000000f00d\",\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -35404,6 +39190,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.retrieve(\n \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.retrieve(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Retrieve(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().retrieve(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->retrieve('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.retrieve(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RetrieveAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -35558,6 +39379,41 @@ "lang": "curl", "label": "curl (change team)", "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"team\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.update(\n \"c1a5e000-0000-4000-8000-000000000001\",\n priority=\"HIGH\",\n due_at=\"2026-11-01T00:00:00Z\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.update(\"c1a5e000-0000-4000-8000-000000000001\", {\n priority: \"HIGH\",\n due_at: \"2026-11-01T00:00:00Z\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Update(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesUpdateParams{\n\tPriority: didit.Some(didit.CasesUpdateParamsPriority(\"HIGH\")),\n\tDueAt: didit.Time(time.Date(2026, 11, 1, 0, 0, 0, 0, time.UTC)),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.OffsetDateTime;\nimport me.didit.Didit;\nimport me.didit.types.CasesUpdateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().update(\"c1a5e000-0000-4000-8000-000000000001\", CasesUpdateParams.builder()\n .priority(CasesUpdateParams.Priority.of(\"HIGH\"))\n .dueAt(OffsetDateTime.parse(\"2026-11-01T00:00:00Z\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->update('c1a5e000-0000-4000-8000-000000000001', [\n 'priority' => 'HIGH',\n 'due_at' => '2026-11-01T00:00:00Z',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.update(\n \"c1a5e000-0000-4000-8000-000000000001\",\n priority: \"HIGH\",\n due_at: \"2026-11-01T00:00:00Z\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.UpdateAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesUpdateParams\n{\n Priority = new CasesUpdateParamsPriority(\"HIGH\"),\n DueAt = DateTimeOffset.Parse(\"2026-11-01T00:00:00Z\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -35701,6 +39557,41 @@ "lang": "curl", "label": "curl", "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.delete(\n \"c1a5e000-0000-4000-8000-000000000001\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.delete(\"c1a5e000-0000-4000-8000-000000000001\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.Delete(ctx, \"c1a5e000-0000-4000-8000-000000000001\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().delete(\"c1a5e000-0000-4000-8000-000000000001\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->delete('c1a5e000-0000-4000-8000-000000000001');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.delete(\"c1a5e000-0000-4000-8000-000000000001\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.DeleteAsync(\"c1a5e000-0000-4000-8000-000000000001\");" } ], "responses": { @@ -35829,6 +39720,9 @@ "nullable": true } } + }, + "example": { + "assignee_user_id": "9a000000-0000-4000-8000-0000000000aa" } } } @@ -35838,6 +39732,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/assign/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"assignee_user_id\": \"9a000000-0000-4000-8000-0000000000aa\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.assign(\n \"c1a5e000-0000-4000-8000-000000000001\",\n assignee_user_id=\"9a000000-0000-4000-8000-0000000000aa\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.assign(\"c1a5e000-0000-4000-8000-000000000001\", {\n assignee_user_id: \"9a000000-0000-4000-8000-0000000000aa\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Assign(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesAssignParams{\n\tAssigneeUserID: didit.String(\"9a000000-0000-4000-8000-0000000000aa\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasesAssignParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().assign(\"c1a5e000-0000-4000-8000-000000000001\", CasesAssignParams.builder()\n .assigneeUserId(\"9a000000-0000-4000-8000-0000000000aa\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->assign('c1a5e000-0000-4000-8000-000000000001', [\n 'assignee_user_id' => '9a000000-0000-4000-8000-0000000000aa',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.assign(\n \"c1a5e000-0000-4000-8000-000000000001\",\n assignee_user_id: \"9a000000-0000-4000-8000-0000000000aa\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.AssignAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesAssignParams\n{\n AssigneeUserId = \"9a000000-0000-4000-8000-0000000000aa\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -35967,7 +39896,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/resolve/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={'resolution': 'FALSE_POSITIVE', 'note': 'Confirmed legitimate activity.'},\n timeout=10,\n)\nresp.raise_for_status()\ncase = resp.json()\nprint(case['status'], case['resolution'], case.get('pending_resolution'))" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.resolve(\n \"c1a5e000-0000-4000-8000-000000000001\",\n resolution=\"FALSE_POSITIVE\",\n note=\"Confirmed legitimate activity after reviewing documents.\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.resolve(\"c1a5e000-0000-4000-8000-000000000001\", {\n resolution: \"FALSE_POSITIVE\",\n note: \"Confirmed legitimate activity after reviewing documents.\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Resolve(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesResolveParams{\n\tResolution: \"FALSE_POSITIVE\",\n\tNote: didit.String(\"Confirmed legitimate activity after reviewing documents.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasesResolveParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().resolve(\"c1a5e000-0000-4000-8000-000000000001\", CasesResolveParams.builder()\n .resolution(CasesResolveParams.Resolution.of(\"FALSE_POSITIVE\"))\n .note(\"Confirmed legitimate activity after reviewing documents.\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->resolve('c1a5e000-0000-4000-8000-000000000001', [\n 'resolution' => 'FALSE_POSITIVE',\n 'note' => 'Confirmed legitimate activity after reviewing documents.',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.resolve(\n \"c1a5e000-0000-4000-8000-000000000001\",\n resolution: \"FALSE_POSITIVE\",\n note: \"Confirmed legitimate activity after reviewing documents.\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ResolveAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesResolveParams\n{\n Resolution = \"FALSE_POSITIVE\",\n Note = \"Confirmed legitimate activity after reviewing documents.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -36104,6 +40063,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/reopen/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.reopen(\n \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.reopen(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Reopen(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().reopen(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->reopen('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.reopen(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ReopenAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -36178,6 +40172,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/request-info/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.request_info(\n \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requestInfo(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RequestInfo(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requestInfo(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->requestInfo('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.request_info(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RequestInfoAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -36252,6 +40281,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/escalate/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.escalate(\n \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.escalate(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Escalate(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().escalate(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->escalate('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.escalate(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.EscalateAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -36336,6 +40400,9 @@ "format": "uuid" } } + }, + "example": { + "target_blueprint": "b1de0000-0000-4000-8000-000000000002" } } } @@ -36345,6 +40412,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/transfer/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"target_blueprint\": \"b1de0000-0000-4000-8000-000000000002\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.transfer(\n \"c1a5e000-0000-4000-8000-000000000001\",\n target_blueprint=\"b1de0000-0000-4000-8000-000000000002\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.transfer(\"c1a5e000-0000-4000-8000-000000000001\", {\n target_blueprint: \"b1de0000-0000-4000-8000-000000000002\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Transfer(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesTransferParams{\n\tTargetBlueprint: \"b1de0000-0000-4000-8000-000000000002\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasesTransferParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().transfer(\"c1a5e000-0000-4000-8000-000000000001\", CasesTransferParams.builder()\n .targetBlueprint(\"b1de0000-0000-4000-8000-000000000002\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->transfer('c1a5e000-0000-4000-8000-000000000001', [\n 'target_blueprint' => 'b1de0000-0000-4000-8000-000000000002',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.transfer(\n \"c1a5e000-0000-4000-8000-000000000001\",\n target_blueprint: \"b1de0000-0000-4000-8000-000000000002\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.TransferAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesTransferParams\n{\n TargetBlueprint = \"b1de0000-0000-4000-8000-000000000002\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -36419,6 +40521,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/approve/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.approve_resolution(\n \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.approveResolution(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.ApproveResolution(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().approveResolution(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->approveResolution('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.approve_resolution(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ApproveResolutionAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -36547,6 +40684,9 @@ "nullable": true } } + }, + "example": { + "notes": "Needs a clearer rationale before this can be approved." } } } @@ -36556,6 +40696,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/reject-approval/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"notes\": \"Needs a clearer rationale before this can be approved.\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.reject_resolution(\n \"c1a5e000-0000-4000-8000-000000000001\",\n notes=\"Needs a clearer rationale before this can be approved.\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.rejectResolution(\"c1a5e000-0000-4000-8000-000000000001\", {\n notes: \"Needs a clearer rationale before this can be approved.\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RejectResolution(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesRejectResolutionParams{\n\tNotes: didit.String(\"Needs a clearer rationale before this can be approved.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasesRejectResolutionParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().rejectResolution(\"c1a5e000-0000-4000-8000-000000000001\", CasesRejectResolutionParams.builder()\n .notes(\"Needs a clearer rationale before this can be approved.\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->rejectResolution('c1a5e000-0000-4000-8000-000000000001', [\n 'notes' => 'Needs a clearer rationale before this can be approved.',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.reject_resolution(\n \"c1a5e000-0000-4000-8000-000000000001\",\n notes: \"Needs a clearer rationale before this can be approved.\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RejectResolutionAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesRejectResolutionParams\n{\n Notes = \"Needs a clearer rationale before this can be approved.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -36676,6 +40851,13 @@ "application/json": { "schema": { "$ref": "#/components/schemas/CaseActionCaseEntityActionRequest" + }, + "example": { + "client_reference": "e1a00000-0000-4000-8000-000000000001", + "action": "add_tags", + "tags": [ + "source-of-funds-reviewed" + ] } }, "multipart/form-data": { @@ -36706,7 +40888,44 @@ "ApiKeyAuth": [] } ], - "description": "Apply one explicit action to the case subject. Supply a unique client_reference to obtain an action receipt and make retries idempotent. Reusing that reference with a different payload returns 409. With a reference, inspect receipt.status even when HTTP status is 200: FAILED means no action was applied. Repeating a failed request does not execute it again unless retry is true. Omitting client_reference preserves the legacy response." + "description": "Apply one explicit action to the case subject. Supply a unique client_reference to obtain an action receipt and make retries idempotent. Reusing that reference with a different payload returns 409. With a reference, inspect receipt.status even when HTTP status is 200: FAILED means no action was applied. Repeating a failed request does not execute it again unless retry is true. Omitting client_reference preserves the legacy response.", + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.apply_entity_action(\n \"11111111-2222-3333-4444-555555555555\",\n client_reference=\"e1a00000-0000-4000-8000-000000000001\",\n action=\"add_tags\",\n tags=[\"source-of-funds-reviewed\"],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.applyEntityAction(\"11111111-2222-3333-4444-555555555555\", {\n client_reference: \"e1a00000-0000-4000-8000-000000000001\",\n action: \"add_tags\",\n tags: [\"source-of-funds-reviewed\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.ApplyEntityAction(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CaseActionCaseEntityActionRequest{\n\tClientReference: didit.String(\"e1a00000-0000-4000-8000-000000000001\"),\n\tAction: didit.CaseActionActionEnum(\"add_tags\"),\n\tTags: didit.Some([]string{\"source-of-funds-reviewed\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CaseActionActionEnum;\nimport me.didit.types.CaseActionCaseEntityActionRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().applyEntityAction(\"11111111-2222-3333-4444-555555555555\", CaseActionCaseEntityActionRequest.builder()\n .clientReference(\"e1a00000-0000-4000-8000-000000000001\")\n .action(CaseActionActionEnum.of(\"add_tags\"))\n .tags(List.of(\"source-of-funds-reviewed\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->applyEntityAction('11111111-2222-3333-4444-555555555555', [\n 'client_reference' => 'e1a00000-0000-4000-8000-000000000001',\n 'action' => 'add_tags',\n 'tags' => ['source-of-funds-reviewed'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.apply_entity_action(\n \"11111111-2222-3333-4444-555555555555\",\n client_reference: \"e1a00000-0000-4000-8000-000000000001\",\n action: \"add_tags\",\n tags: [\"source-of-funds-reviewed\"]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ApplyEntityActionAsync(\"11111111-2222-3333-4444-555555555555\", new CaseActionCaseEntityActionRequest\n{\n ClientReference = \"e1a00000-0000-4000-8000-000000000001\",\n Action = \"add_tags\",\n Tags = new string[] { \"source-of-funds-reviewed\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/print/": { @@ -36762,6 +40981,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/print/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.print(\n \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.print(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Print(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().print(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->print('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.print(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.PrintAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -36880,6 +41134,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.notes.list(\n \"11111111-2222-3333-4444-555555555555\",\n):\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.notes.list(\"11111111-2222-3333-4444-555555555555\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.Notes.ListAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasesNotesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().notes().list(\"11111111-2222-3333-4444-555555555555\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->notes->list('11111111-2222-3333-4444-555555555555') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.notes.list(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.Notes.ListAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } ] }, "post": { @@ -36930,6 +41221,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/CaseCollaborationCaseNoteCreateRequest" + }, + "example": { + "comment": "Proof of address matches the ID document." } }, "multipart/form-data": { @@ -36979,7 +41273,44 @@ "ApiKeyAuth": [] } ], - "description": "Add a case-scoped note. An optional client_reference makes an unchanged retry return the same note without duplicate activity or notifications. reply_to must identify a live note in this case. The response includes a bounded parent excerpt without copying that excerpt into the saved reply." + "description": "Add a case-scoped note. An optional client_reference makes an unchanged retry return the same note without duplicate activity or notifications. reply_to must identify a live note in this case. The response includes a bounded parent excerpt without copying that excerpt into the saved reply.", + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.notes.create(\n \"11111111-2222-3333-4444-555555555555\",\n comment=\"Proof of address matches the ID document.\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.notes.create(\"11111111-2222-3333-4444-555555555555\", {\n comment: \"Proof of address matches the ID document.\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Notes.Create(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CaseCollaborationCaseNoteCreateRequest{\n\tComment: \"Proof of address matches the ID document.\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CaseCollaborationCaseNoteCreateRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().notes().create(\"11111111-2222-3333-4444-555555555555\", CaseCollaborationCaseNoteCreateRequest.builder()\n .comment(\"Proof of address matches the ID document.\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->notes->create('11111111-2222-3333-4444-555555555555', [\n 'comment' => 'Proof of address matches the ID document.',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.notes.create(\n \"11111111-2222-3333-4444-555555555555\",\n comment: \"Proof of address matches the ID document.\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Notes.CreateAsync(\"11111111-2222-3333-4444-555555555555\", new CaseCollaborationCaseNoteCreateRequest\n{\n Comment = \"Proof of address matches the ID document.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/notes/{note_uuid}/": { @@ -37040,6 +41371,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/CaseCollaborationPatchedCaseNoteUpdateRequest" + }, + "example": { + "is_pinned": true } }, "multipart/form-data": { @@ -37075,7 +41409,44 @@ "ApiKeyAuth": [] } ], - "description": "Pin or unpin an existing note. Pinned notes appear first. Pin changes are recorded in case activity and do not change evidence or source decisions." + "description": "Pin or unpin an existing note. Pinned notes appear first. Pin changes are recorded in case activity and do not change evidence or source decisions.", + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.notes.update(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n is_pinned=True,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.notes.update(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n {\n is_pinned: true,\n },\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Notes.Update(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", didit.CaseCollaborationPatchedCaseNoteUpdateRequest{\n\tIsPinned: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CaseCollaborationPatchedCaseNoteUpdateRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().notes().update(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", CaseCollaborationPatchedCaseNoteUpdateRequest.builder()\n .isPinned(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->notes->update('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555', [\n 'is_pinned' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.notes.update(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n is_pinned: true\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Notes.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", new CaseCollaborationPatchedCaseNoteUpdateRequest\n{\n IsPinned = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] }, "delete": { "operationId": "delete_case_note", @@ -37142,6 +41513,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.notes.delete(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.notes.delete(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.Notes.Delete(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().notes().delete(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->notes->delete('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.notes.delete(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\"\n)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.Notes.DeleteAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");" + } ] } }, @@ -37217,6 +41625,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/notes/presign/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -F 'file=@evidence.pdf'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.notes.create_attachment_upload(\n \"c1a5e000-0000-4000-8000-000000000001\",\n file=open(\"document.pdf\", \"rb\"),\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.notes.createAttachmentUpload(\"c1a5e000-0000-4000-8000-000000000001\", {\n file: await fileFromPath(\"document.pdf\"),\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Notes.CreateAttachmentUpload(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesNotesCreateAttachmentUploadParams{\n\tFile: didit.FileFromPath(\"document.pdf\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.CasesNotesCreateAttachmentUploadParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().notes().createAttachmentUpload(\"c1a5e000-0000-4000-8000-000000000001\", CasesNotesCreateAttachmentUploadParams.builder()\n .file(Path.of(\"document.pdf\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->notes->createAttachmentUpload('c1a5e000-0000-4000-8000-000000000001', [\n 'file' => File::fromPath('document.pdf'),\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.notes.create_attachment_upload(\n \"c1a5e000-0000-4000-8000-000000000001\",\n file: Pathname(\"document.pdf\")\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Notes.CreateAttachmentUploadAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesNotesCreateAttachmentUploadParams\n{\n File = FileUpload.FromPath(\"document.pdf\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -37323,6 +41766,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/notes/presign/?s3_key=case-notes/c1a5e000-0000-4000-8000-000000000001/evidence.pdf' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.notes.retrieve_attachment_url(\n \"c1a5e000-0000-4000-8000-000000000001\",\n s3_key=\"your-s3-key\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.notes.retrieveAttachmentUrl(\"c1a5e000-0000-4000-8000-000000000001\", {\n s3_key: \"your-s3-key\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Notes.RetrieveAttachmentURL(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesNotesRetrieveAttachmentURLParams{\n\tS3Key: \"your-s3-key\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasesNotesRetrieveAttachmentUrlParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().notes().retrieveAttachmentUrl(\"c1a5e000-0000-4000-8000-000000000001\", CasesNotesRetrieveAttachmentUrlParams.builder()\n .s3Key(\"your-s3-key\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->notes->retrieveAttachmentUrl('c1a5e000-0000-4000-8000-000000000001', [\n 's3_key' => 'your-s3-key',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.notes.retrieve_attachment_url(\n \"c1a5e000-0000-4000-8000-000000000001\",\n s3_key: \"your-s3-key\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Notes.RetrieveAttachmentUrlAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesNotesRetrieveAttachmentUrlParams\n{\n S3Key = \"your-s3-key\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -37419,6 +41897,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/links/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.links.list(\n \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.links.list(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Links.List(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().links().list(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->links->list('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.links.list(\"c1a5e000-0000-4000-8000-000000000001\").each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Links.ListAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -37513,6 +42026,10 @@ "format": "uuid" } } + }, + "example": { + "entity_type": "transaction", + "entity_uuid": "77000000-0000-4000-8000-000000000077" } } } @@ -37522,6 +42039,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/links/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"entity_type\": \"transaction\", \"entity_uuid\": \"77000000-0000-4000-8000-000000000077\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.links.create(\n \"c1a5e000-0000-4000-8000-000000000001\",\n entity_type=\"transaction\",\n entity_uuid=\"77000000-0000-4000-8000-000000000077\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.links.create(\"c1a5e000-0000-4000-8000-000000000001\", {\n entity_type: \"transaction\",\n entity_uuid: \"77000000-0000-4000-8000-000000000077\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Links.Create(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesLinksCreateParams{\n\tEntityType: \"transaction\",\n\tEntityUUID: \"77000000-0000-4000-8000-000000000077\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasesLinksCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().links().create(\"c1a5e000-0000-4000-8000-000000000001\", CasesLinksCreateParams.builder()\n .entityType(CasesLinksCreateParams.EntityType.of(\"transaction\"))\n .entityUuid(\"77000000-0000-4000-8000-000000000077\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->links->create('c1a5e000-0000-4000-8000-000000000001', [\n 'entity_type' => 'transaction',\n 'entity_uuid' => '77000000-0000-4000-8000-000000000077',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.links.create(\n \"c1a5e000-0000-4000-8000-000000000001\",\n entity_type: \"transaction\",\n entity_uuid: \"77000000-0000-4000-8000-000000000077\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Links.CreateAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesLinksCreateParams\n{\n EntityType = \"transaction\",\n EntityUuid = \"77000000-0000-4000-8000-000000000077\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -37622,6 +42174,41 @@ "lang": "curl", "label": "curl", "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/links/11000000-0000-4000-8000-000000000004/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.links.delete(\n \"c1a5e000-0000-4000-8000-000000000001\",\n \"11000000-0000-4000-8000-000000000004\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.links.delete(\n \"c1a5e000-0000-4000-8000-000000000001\",\n \"11000000-0000-4000-8000-000000000004\",\n);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.Links.Delete(ctx, \"c1a5e000-0000-4000-8000-000000000001\", \"11000000-0000-4000-8000-000000000004\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().links().delete(\"c1a5e000-0000-4000-8000-000000000001\", \"11000000-0000-4000-8000-000000000004\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->links->delete('c1a5e000-0000-4000-8000-000000000001', '11000000-0000-4000-8000-000000000004');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.links.delete(\n \"c1a5e000-0000-4000-8000-000000000001\",\n \"11000000-0000-4000-8000-000000000004\"\n)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.Links.DeleteAsync(\"c1a5e000-0000-4000-8000-000000000001\", \"11000000-0000-4000-8000-000000000004\");" } ], "responses": { @@ -37709,6 +42296,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/events/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.list_events(\n \"c1a5e000-0000-4000-8000-000000000001\",\n):\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.listEvents(\"c1a5e000-0000-4000-8000-000000000001\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.ListEventsAutoPaging(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesListEventsParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().listEvents(\"c1a5e000-0000-4000-8000-000000000001\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->listEvents('c1a5e000-0000-4000-8000-000000000001') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.list_events(\"c1a5e000-0000-4000-8000-000000000001\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.ListEventsAsync(\"c1a5e000-0000-4000-8000-000000000001\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -37805,6 +42427,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/checklist/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.checklist.list(\n \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.checklist.list(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Checklist.List(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().checklist().list(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->checklist->list('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.checklist.list(\"c1a5e000-0000-4000-8000-000000000001\").each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Checklist.ListAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -37902,6 +42559,9 @@ "type": "boolean" } } + }, + "example": { + "is_completed": true } } } @@ -37911,6 +42571,41 @@ "lang": "curl", "label": "curl", "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/checklist/c4ec0000-0000-4000-8000-000000000005/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"is_completed\": true}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.checklist.toggle_item(\n \"c1a5e000-0000-4000-8000-000000000001\",\n \"c4ec0000-0000-4000-8000-000000000005\",\n is_completed=True,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.checklist.toggleItem(\n \"c1a5e000-0000-4000-8000-000000000001\",\n \"c4ec0000-0000-4000-8000-000000000005\",\n {\n is_completed: true,\n },\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Checklist.ToggleItem(ctx, \"c1a5e000-0000-4000-8000-000000000001\", \"c4ec0000-0000-4000-8000-000000000005\", didit.CasesChecklistToggleItemParams{\n\tIsCompleted: true,\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasesChecklistToggleItemParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().checklist().toggleItem(\"c1a5e000-0000-4000-8000-000000000001\", \"c4ec0000-0000-4000-8000-000000000005\", CasesChecklistToggleItemParams.builder()\n .isCompleted(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->checklist->toggleItem('c1a5e000-0000-4000-8000-000000000001', 'c4ec0000-0000-4000-8000-000000000005', [\n 'is_completed' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.checklist.toggle_item(\n \"c1a5e000-0000-4000-8000-000000000001\",\n \"c4ec0000-0000-4000-8000-000000000005\",\n is_completed: true\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Checklist.ToggleItemAsync(\"c1a5e000-0000-4000-8000-000000000001\", \"c4ec0000-0000-4000-8000-000000000005\", new CasesChecklistToggleItemParams\n{\n IsCompleted = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -37985,6 +42680,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/aml/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.list_aml_hits(\n \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.listAmlHits(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.ListAMLHits(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().listAmlHits(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->listAmlHits('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.list_aml_hits(\"c1a5e000-0000-4000-8000-000000000001\").each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ListAmlHitsAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -38132,6 +42862,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/statistics/?date_from=2026-06-01&date_to=2026-06-30' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.retrieve_statistics()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.retrieveStatistics();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RetrieveStatistics(ctx, didit.CasesRetrieveStatisticsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().retrieveStatistics();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->retrieveStatistics();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.retrieve_statistics\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RetrieveStatisticsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -38523,6 +43288,13 @@ "nullable": true } } + }, + "example": { + "case_uuids": [ + "c1a5e000-0000-4000-8000-000000000001" + ], + "status": "RESOLVED", + "resolution": "FALSE_POSITIVE" } } } @@ -38532,6 +43304,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/bulk/status/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"case_uuids\": [\"c1a5e000-0000-4000-8000-000000000001\"], \"status\": \"RESOLVED\", \"resolution\": \"FALSE_POSITIVE\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.bulk_update_status(\n case_uuids=[\"c1a5e000-0000-4000-8000-000000000001\"],\n status=\"RESOLVED\",\n resolution=\"FALSE_POSITIVE\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.bulkUpdateStatus({\n case_uuids: [\"c1a5e000-0000-4000-8000-000000000001\"],\n status: \"RESOLVED\",\n resolution: \"FALSE_POSITIVE\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.BulkUpdateStatus(ctx, didit.CasesBulkUpdateStatusParams{\n\tCaseUUIDs: []string{\"c1a5e000-0000-4000-8000-000000000001\"},\n\tStatus: \"RESOLVED\",\n\tResolution: didit.Some(didit.CasesBulkUpdateStatusParamsResolution(\"FALSE_POSITIVE\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CasesBulkUpdateStatusParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().bulkUpdateStatus(CasesBulkUpdateStatusParams.builder()\n .caseUuids(List.of(\"c1a5e000-0000-4000-8000-000000000001\"))\n .status(CasesBulkUpdateStatusParams.Status.of(\"RESOLVED\"))\n .resolution(CasesBulkUpdateStatusParams.Resolution.of(\"FALSE_POSITIVE\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->bulkUpdateStatus([\n 'case_uuids' => ['c1a5e000-0000-4000-8000-000000000001'],\n 'status' => 'RESOLVED',\n 'resolution' => 'FALSE_POSITIVE',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.bulk_update_status(\n case_uuids: [\"c1a5e000-0000-4000-8000-000000000001\"],\n status: \"RESOLVED\",\n resolution: \"FALSE_POSITIVE\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.BulkUpdateStatusAsync(new CasesBulkUpdateStatusParams\n{\n CaseUuids = new string[] { \"c1a5e000-0000-4000-8000-000000000001\" },\n Status = \"RESOLVED\",\n Resolution = new CasesBulkUpdateStatusParamsResolution(\"FALSE_POSITIVE\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -38624,6 +43431,12 @@ "nullable": true } } + }, + "example": { + "case_uuids": [ + "c1a5e000-0000-4000-8000-000000000001" + ], + "assignee_user_id": "9a000000-0000-4000-8000-0000000000aa" } } } @@ -38633,6 +43446,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/bulk/assign/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"case_uuids\": [\"c1a5e000-0000-4000-8000-000000000001\"], \"assignee_user_id\": \"9a000000-0000-4000-8000-0000000000aa\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.bulk_assign(\n case_uuids=[\"c1a5e000-0000-4000-8000-000000000001\"],\n assignee_user_id=\"9a000000-0000-4000-8000-0000000000aa\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.bulkAssign({\n case_uuids: [\"c1a5e000-0000-4000-8000-000000000001\"],\n assignee_user_id: \"9a000000-0000-4000-8000-0000000000aa\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.BulkAssign(ctx, didit.CasesBulkAssignParams{\n\tCaseUUIDs: []string{\"c1a5e000-0000-4000-8000-000000000001\"},\n\tAssigneeUserID: didit.String(\"9a000000-0000-4000-8000-0000000000aa\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CasesBulkAssignParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().bulkAssign(CasesBulkAssignParams.builder()\n .caseUuids(List.of(\"c1a5e000-0000-4000-8000-000000000001\"))\n .assigneeUserId(\"9a000000-0000-4000-8000-0000000000aa\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->bulkAssign([\n 'case_uuids' => ['c1a5e000-0000-4000-8000-000000000001'],\n 'assignee_user_id' => '9a000000-0000-4000-8000-0000000000aa',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.bulk_assign(\n case_uuids: [\"c1a5e000-0000-4000-8000-000000000001\"],\n assignee_user_id: \"9a000000-0000-4000-8000-0000000000aa\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.BulkAssignAsync(new CasesBulkAssignParams\n{\n CaseUuids = new string[] { \"c1a5e000-0000-4000-8000-000000000001\" },\n AssigneeUserId = \"9a000000-0000-4000-8000-0000000000aa\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -38716,6 +43564,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.blueprints.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.blueprints.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.Blueprints.ListAutoPaging(ctx, didit.CasesBlueprintsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().blueprints().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.blueprints.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.Blueprints.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -38880,6 +43763,22 @@ "description": "Set false to save a never-published draft. The record remains inactive at version 0 until the draft is explicitly published. Omitting this field preserves immediate creation for existing integrations." } } + }, + "example": { + "name": "AML investigation", + "assignee_pool": [ + "9a000000-0000-4000-8000-0000000000aa" + ], + "assignment_method": "AUTOMATIC", + "max_active_cases": 15, + "require_resolution_note": true, + "content_config": { + "aml_control": { + "enabled": true, + "financial": true, + "identity": false + } + } } } } @@ -38889,6 +43788,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"name\": \"AML investigation\", \"assignee_pool\": [\"9a000000-0000-4000-8000-0000000000aa\"], \"assignment_method\": \"AUTOMATIC\", \"max_active_cases\": 15, \"require_resolution_note\": true, \"content_config\": {\"aml_control\": {\"enabled\": true, \"financial\": true, \"identity\": false}}}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.create(\n name=\"AML investigation\",\n assignee_pool=[\"9a000000-0000-4000-8000-0000000000aa\"],\n assignment_method=\"AUTOMATIC\",\n max_active_cases=15,\n require_resolution_note=True,\n content_config={\n \"aml_control\": {\n \"enabled\": True,\n \"financial\": True,\n \"identity\": False,\n },\n },\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.create({\n name: \"AML investigation\",\n assignee_pool: [\"9a000000-0000-4000-8000-0000000000aa\"],\n assignment_method: \"AUTOMATIC\",\n max_active_cases: 15,\n require_resolution_note: true,\n content_config: {\n aml_control: {\n enabled: true,\n financial: true,\n identity: false,\n },\n },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.Create(ctx, didit.CasesBlueprintsCreateParams{\n\tName: \"AML investigation\",\n\tAssigneePool: []string{\"9a000000-0000-4000-8000-0000000000aa\"},\n\tAssignmentMethod: didit.Some(didit.CasesBlueprintsCreateParamsAssignmentMethod(\"AUTOMATIC\")),\n\tMaxActiveCases: didit.Int(15),\n\tRequireResolutionNote: didit.Bool(true),\n\tContentConfig: didit.Some(didit.CaseContentConfigParam{\n\t\tAMLControl: didit.Some(didit.CaseContentConfigParamAMLControl{\n\t\t\tEnabled: didit.Bool(true),\n\t\t\tFinancial: didit.Bool(true),\n\t\t\tIdentity: didit.Bool(false),\n\t\t}),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CaseContentConfig;\nimport me.didit.types.CasesBlueprintsCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().create(CasesBlueprintsCreateParams.builder()\n .name(\"AML investigation\")\n .assigneePool(List.of(\"9a000000-0000-4000-8000-0000000000aa\"))\n .assignmentMethod(CasesBlueprintsCreateParams.AssignmentMethod.of(\"AUTOMATIC\"))\n .maxActiveCases(15L)\n .requireResolutionNote(true)\n .contentConfig(CaseContentConfig.builder()\n .amlControl(CaseContentConfig.AmlControl.builder()\n .enabled(true)\n .financial(true)\n .identity(false)\n .build())\n .build())\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->create([\n 'name' => 'AML investigation',\n 'assignee_pool' => ['9a000000-0000-4000-8000-0000000000aa'],\n 'assignment_method' => 'AUTOMATIC',\n 'max_active_cases' => 15,\n 'require_resolution_note' => true,\n 'content_config' => [\n 'aml_control' => [\n 'enabled' => true,\n 'financial' => true,\n 'identity' => false,\n ],\n ],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.create(\n name: \"AML investigation\",\n assignee_pool: [\"9a000000-0000-4000-8000-0000000000aa\"],\n assignment_method: \"AUTOMATIC\",\n max_active_cases: 15,\n require_resolution_note: true,\n content_config: {\n aml_control: {\n enabled: true,\n financial: true,\n identity: false,\n },\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.CreateAsync(new CasesBlueprintsCreateParams\n{\n Name = \"AML investigation\",\n AssigneePool = new string[] { \"9a000000-0000-4000-8000-0000000000aa\" },\n AssignmentMethod = new CasesBlueprintsCreateParamsAssignmentMethod(\"AUTOMATIC\"),\n MaxActiveCases = 15,\n RequireResolutionNote = true,\n ContentConfig = new CaseContentConfig\n {\n AmlControl = new CaseContentConfigAmlControl\n {\n Enabled = true,\n Financial = true,\n Identity = false,\n },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -38973,6 +43907,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/b1de0000-0000-4000-8000-000000000002/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.retrieve(\n \"b1de0000-0000-4000-8000-000000000002\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.retrieve(\"b1de0000-0000-4000-8000-000000000002\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.Retrieve(ctx, \"b1de0000-0000-4000-8000-000000000002\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().retrieve(\"b1de0000-0000-4000-8000-000000000002\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->retrieve('b1de0000-0000-4000-8000-000000000002');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.retrieve(\"b1de0000-0000-4000-8000-000000000002\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.RetrieveAsync(\"b1de0000-0000-4000-8000-000000000002\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -39118,6 +44087,9 @@ "description": "The version opened by the editor. A stale version returns 409 without changing the review policy." } } + }, + "example": { + "transfer_enabled": true } } } @@ -39127,6 +44099,41 @@ "lang": "curl", "label": "curl", "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/b1de0000-0000-4000-8000-000000000002/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"transfer_enabled\": true}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.update(\n \"b1de0000-0000-4000-8000-000000000002\",\n transfer_enabled=True,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.update(\"b1de0000-0000-4000-8000-000000000002\", {\n transfer_enabled: true,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.Update(ctx, \"b1de0000-0000-4000-8000-000000000002\", didit.CasesBlueprintsUpdateParams{\n\tTransferEnabled: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasesBlueprintsUpdateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().update(\"b1de0000-0000-4000-8000-000000000002\", CasesBlueprintsUpdateParams.builder()\n .transferEnabled(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->update('b1de0000-0000-4000-8000-000000000002', [\n 'transfer_enabled' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.update(\n \"b1de0000-0000-4000-8000-000000000002\",\n transfer_enabled: true\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.UpdateAsync(\"b1de0000-0000-4000-8000-000000000002\", new CasesBlueprintsUpdateParams\n{\n TransferEnabled = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -39202,6 +44209,41 @@ "lang": "curl", "label": "curl", "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/b1de0000-0000-4000-8000-000000000002/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.blueprints.delete(\n \"b1de0000-0000-4000-8000-000000000002\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.blueprints.delete(\"b1de0000-0000-4000-8000-000000000002\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.Blueprints.Delete(ctx, \"b1de0000-0000-4000-8000-000000000002\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().blueprints().delete(\"b1de0000-0000-4000-8000-000000000002\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->delete('b1de0000-0000-4000-8000-000000000002');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.blueprints.delete(\"b1de0000-0000-4000-8000-000000000002\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.Blueprints.DeleteAsync(\"b1de0000-0000-4000-8000-000000000002\");" } ], "responses": { @@ -39258,6 +44300,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/presets/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.list_presets()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.listPresets();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.ListPresets(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().listPresets();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->listPresets();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.list_presets\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.ListPresetsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -39363,6 +44440,12 @@ "description": "Subset of screening_hit, aml_investigation, suspicious_activity, kyc. Omit to install all." } } + }, + "example": { + "preset_keys": [ + "aml_investigation", + "kyc" + ] } } } @@ -39372,6 +44455,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/presets/install/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"preset_keys\": [\"aml_investigation\", \"kyc\"]}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.install_presets(\n preset_keys=[\"aml_investigation\", \"kyc\"],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.installPresets({\n preset_keys: [\"aml_investigation\", \"kyc\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.InstallPresets(ctx, didit.CasesBlueprintsInstallPresetsParams{\n\tPresetKeys: didit.Some([]string{\"aml_investigation\", \"kyc\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CasesBlueprintsInstallPresetsParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().installPresets(CasesBlueprintsInstallPresetsParams.builder()\n .presetKeys(List.of(\"aml_investigation\", \"kyc\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->installPresets([\n 'preset_keys' => ['aml_investigation', 'kyc'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.install_presets(preset_keys: [\"aml_investigation\", \"kyc\"])\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.InstallPresetsAsync(new CasesBlueprintsInstallPresetsParams\n{\n PresetKeys = new string[] { \"aml_investigation\", \"kyc\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -39465,6 +44583,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/report-templates/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.report_templates.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.reportTemplates.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.ReportTemplates.ListAutoPaging(ctx, didit.ReportTemplatesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.reportTemplates().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "reportTemplates->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.report_templates.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.ReportTemplates.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -39580,6 +44733,16 @@ "description": "Reusable goAML header defaults. Template-level obligatory fields: rentity_id, submission_code, and currency_code_local (3-letter). Optional: enabled_fields (which optional report blocks to include) plus reporting_person, location, reason, and action defaults. Per-filing header fields (action, submission_date, transactions, jurisdiction) are enforced when the report is validated or finalized, not on the template." } } + }, + "example": { + "name": "US SAR default", + "jurisdiction": "US", + "report_type": "SAR", + "field_config": { + "rentity_id": "FIU-US-00123", + "submission_code": "E", + "currency_code_local": "USD" + } } } } @@ -39593,7 +44756,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/report-templates/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={\n 'name': 'US SAR default',\n 'jurisdiction': 'US',\n 'report_type': 'SAR',\n 'field_config': {'rentity_id': 'FIU-US-00123', 'submission_code': 'E', 'currency_code_local': 'USD'},\n },\n timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json()['uuid'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.report_templates.create(\n name=\"US SAR default\",\n jurisdiction=\"US\",\n report_type=\"SAR\",\n field_config={\"rentity_id\": \"FIU-US-00123\", \"submission_code\": \"E\", \"currency_code_local\": \"USD\"},\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.reportTemplates.create({\n name: \"US SAR default\",\n jurisdiction: \"US\",\n report_type: \"SAR\",\n field_config: { rentity_id: \"FIU-US-00123\", submission_code: \"E\", currency_code_local: \"USD\" },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.ReportTemplates.Create(ctx, didit.ReportTemplatesCreateParams{\n\tName: \"US SAR default\",\n\tJurisdiction: \"US\",\n\tReportType: \"SAR\",\n\tFieldConfig: didit.Some(map[string]any{\"rentity_id\": \"FIU-US-00123\", \"submission_code\": \"E\", \"currency_code_local\": \"USD\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.ReportTemplatesCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.reportTemplates().create(ReportTemplatesCreateParams.builder()\n .name(\"US SAR default\")\n .jurisdiction(\"US\")\n .reportType(ReportTemplatesCreateParams.ReportType.of(\"SAR\"))\n .fieldConfig(Map.of(\"rentity_id\", \"FIU-US-00123\", \"submission_code\", \"E\", \"currency_code_local\", \"USD\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "reportTemplates->create([\n 'name' => 'US SAR default',\n 'jurisdiction' => 'US',\n 'report_type' => 'SAR',\n 'field_config' => ['rentity_id' => 'FIU-US-00123', 'submission_code' => 'E', 'currency_code_local' => 'USD'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.report_templates.create(\n name: \"US SAR default\",\n jurisdiction: \"US\",\n report_type: \"SAR\",\n field_config: { rentity_id: \"FIU-US-00123\", submission_code: \"E\", currency_code_local: \"USD\" }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.ReportTemplates.CreateAsync(new ReportTemplatesCreateParams\n{\n Name = \"US SAR default\",\n Jurisdiction = \"US\",\n ReportType = \"SAR\",\n FieldConfig = new Dictionary { [\"rentity_id\"] = \"FIU-US-00123\", [\"submission_code\"] = \"E\", [\"currency_code_local\"] = \"USD\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -39686,6 +44879,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/report-templates/7ec00000-0000-4000-8000-000000000006/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.report_templates.retrieve(\n \"7ec00000-0000-4000-8000-000000000006\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.reportTemplates.retrieve(\"7ec00000-0000-4000-8000-000000000006\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.ReportTemplates.Retrieve(ctx, \"7ec00000-0000-4000-8000-000000000006\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.reportTemplates().retrieve(\"7ec00000-0000-4000-8000-000000000006\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "reportTemplates->retrieve('7ec00000-0000-4000-8000-000000000006');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.report_templates.retrieve(\"7ec00000-0000-4000-8000-000000000006\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.ReportTemplates.RetrieveAsync(\"7ec00000-0000-4000-8000-000000000006\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -39787,6 +45015,11 @@ "description": "Reusable goAML header defaults. Template-level obligatory fields: rentity_id, submission_code, and currency_code_local (3-letter). Optional: enabled_fields (which optional report blocks to include) plus reporting_person, location, reason, and action defaults. Per-filing header fields (action, submission_date, transactions, jurisdiction) are enforced when the report is validated or finalized, not on the template." } } + }, + "example": { + "field_config": { + "rentity_id": "FIU-US-00124" + } } } } @@ -39796,6 +45029,41 @@ "lang": "curl", "label": "curl", "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/report-templates/7ec00000-0000-4000-8000-000000000006/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"field_config\": {\"rentity_id\": \"FIU-US-00124\"}}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.report_templates.update(\n \"7ec00000-0000-4000-8000-000000000006\",\n field_config={\"rentity_id\": \"FIU-US-00124\"},\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.reportTemplates.update(\"7ec00000-0000-4000-8000-000000000006\", {\n field_config: { rentity_id: \"FIU-US-00124\" },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.ReportTemplates.Update(ctx, \"7ec00000-0000-4000-8000-000000000006\", didit.ReportTemplatesUpdateParams{\n\tFieldConfig: didit.Some(map[string]any{\"rentity_id\": \"FIU-US-00124\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.ReportTemplatesUpdateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.reportTemplates().update(\"7ec00000-0000-4000-8000-000000000006\", ReportTemplatesUpdateParams.builder()\n .fieldConfig(Map.of(\"rentity_id\", \"FIU-US-00124\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "reportTemplates->update('7ec00000-0000-4000-8000-000000000006', [\n 'field_config' => ['rentity_id' => 'FIU-US-00124'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.report_templates.update(\n \"7ec00000-0000-4000-8000-000000000006\",\n field_config: { rentity_id: \"FIU-US-00124\" }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.ReportTemplates.UpdateAsync(\"7ec00000-0000-4000-8000-000000000006\", new ReportTemplatesUpdateParams\n{\n FieldConfig = new Dictionary { [\"rentity_id\"] = \"FIU-US-00124\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -39868,6 +45136,41 @@ "lang": "curl", "label": "curl", "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/report-templates/7ec00000-0000-4000-8000-000000000006/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.report_templates.delete(\n \"7ec00000-0000-4000-8000-000000000006\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.reportTemplates.delete(\"7ec00000-0000-4000-8000-000000000006\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.ReportTemplates.Delete(ctx, \"7ec00000-0000-4000-8000-000000000006\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.reportTemplates().delete(\"7ec00000-0000-4000-8000-000000000006\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "reportTemplates->delete('7ec00000-0000-4000-8000-000000000006');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.report_templates.delete(\"7ec00000-0000-4000-8000-000000000006\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.ReportTemplates.DeleteAsync(\"7ec00000-0000-4000-8000-000000000006\");" } ], "responses": { @@ -39955,6 +45258,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/regulatory-reports/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.regulatory_reports.list(\n \"c1a5e000-0000-4000-8000-000000000001\",\n):\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.regulatoryReports.list(\"c1a5e000-0000-4000-8000-000000000001\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.RegulatoryReports.ListAutoPaging(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesRegulatoryReportsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().regulatoryReports().list(\"c1a5e000-0000-4000-8000-000000000001\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->regulatoryReports->list('c1a5e000-0000-4000-8000-000000000001') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.regulatory_reports.list(\"c1a5e000-0000-4000-8000-000000000001\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.RegulatoryReports.ListAsync(\"c1a5e000-0000-4000-8000-000000000001\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -40153,6 +45491,9 @@ } } } + }, + "example": { + "template": "7ec00000-0000-4000-8000-000000000006" } } } @@ -40162,6 +45503,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/regulatory-reports/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"template\": \"7ec00000-0000-4000-8000-000000000006\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.regulatory_reports.create(\n \"c1a5e000-0000-4000-8000-000000000001\",\n template=\"7ec00000-0000-4000-8000-000000000006\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.regulatoryReports.create(\"c1a5e000-0000-4000-8000-000000000001\", {\n template: \"7ec00000-0000-4000-8000-000000000006\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RegulatoryReports.Create(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesRegulatoryReportsCreateParams{\n\tTemplate: didit.String(\"7ec00000-0000-4000-8000-000000000006\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasesRegulatoryReportsCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().regulatoryReports().create(\"c1a5e000-0000-4000-8000-000000000001\", CasesRegulatoryReportsCreateParams.builder()\n .template(\"7ec00000-0000-4000-8000-000000000006\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->regulatoryReports->create('c1a5e000-0000-4000-8000-000000000001', [\n 'template' => '7ec00000-0000-4000-8000-000000000006',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.regulatory_reports.create(\n \"c1a5e000-0000-4000-8000-000000000001\",\n template: \"7ec00000-0000-4000-8000-000000000006\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RegulatoryReports.CreateAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesRegulatoryReportsCreateParams\n{\n Template = \"7ec00000-0000-4000-8000-000000000006\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -40300,6 +45676,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.regulatory_reports.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.regulatoryReports.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.RegulatoryReports.ListAutoPaging(ctx, didit.RegulatoryReportsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.regulatoryReports().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "regulatoryReports->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.regulatory_reports.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.RegulatoryReports.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -40493,6 +45904,10 @@ } } } + }, + "example": { + "case": "c1a5e000-0000-4000-8000-000000000001", + "template": "7ec00000-0000-4000-8000-000000000006" } } } @@ -40502,6 +45917,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"case\": \"c1a5e000-0000-4000-8000-000000000001\", \"template\": \"7ec00000-0000-4000-8000-000000000006\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.create(\n case=\"c1a5e000-0000-4000-8000-000000000001\",\n template=\"7ec00000-0000-4000-8000-000000000006\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.create({\n case: \"c1a5e000-0000-4000-8000-000000000001\",\n template: \"7ec00000-0000-4000-8000-000000000006\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.Create(ctx, didit.RegulatoryReportsCreateParams{\n\tCase: \"c1a5e000-0000-4000-8000-000000000001\",\n\tTemplate: \"7ec00000-0000-4000-8000-000000000006\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.RegulatoryReportsCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().create(RegulatoryReportsCreateParams.builder()\n .case_(\"c1a5e000-0000-4000-8000-000000000001\")\n .template(\"7ec00000-0000-4000-8000-000000000006\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "regulatoryReports->create([\n 'case' => 'c1a5e000-0000-4000-8000-000000000001',\n 'template' => '7ec00000-0000-4000-8000-000000000006',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.create(\n case: \"c1a5e000-0000-4000-8000-000000000001\",\n template: \"7ec00000-0000-4000-8000-000000000006\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.CreateAsync(new RegulatoryReportsCreateParams\n{\n Case = \"c1a5e000-0000-4000-8000-000000000001\",\n Template = \"7ec00000-0000-4000-8000-000000000006\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -40591,6 +46041,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.retrieve(\n \"5ec00000-0000-4000-8000-000000000007\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.retrieve(\"5ec00000-0000-4000-8000-000000000007\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.Retrieve(ctx, \"5ec00000-0000-4000-8000-000000000007\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().retrieve(\"5ec00000-0000-4000-8000-000000000007\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "regulatoryReports->retrieve('5ec00000-0000-4000-8000-000000000007');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.retrieve(\"5ec00000-0000-4000-8000-000000000007\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.RetrieveAsync(\"5ec00000-0000-4000-8000-000000000007\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -40759,6 +46244,10 @@ } } } + }, + "example": { + "rentity_id": "FIU-US-00123", + "currency_code_local": "USD" } } } @@ -40768,6 +46257,41 @@ "lang": "curl", "label": "curl", "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"rentity_id\": \"FIU-US-00123\", \"currency_code_local\": \"USD\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.update(\n \"5ec00000-0000-4000-8000-000000000007\",\n rentity_id=\"FIU-US-00123\",\n currency_code_local=\"USD\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.update(\"5ec00000-0000-4000-8000-000000000007\", {\n rentity_id: \"FIU-US-00123\",\n currency_code_local: \"USD\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.Update(ctx, \"5ec00000-0000-4000-8000-000000000007\", didit.RegulatoryReportsUpdateParams{\n\tRentityID: didit.String(\"FIU-US-00123\"),\n\tCurrencyCodeLocal: didit.String(\"USD\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.RegulatoryReportsUpdateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().update(\"5ec00000-0000-4000-8000-000000000007\", RegulatoryReportsUpdateParams.builder()\n .rentityId(\"FIU-US-00123\")\n .currencyCodeLocal(\"USD\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "regulatoryReports->update('5ec00000-0000-4000-8000-000000000007', [\n 'rentity_id' => 'FIU-US-00123',\n 'currency_code_local' => 'USD',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.update(\n \"5ec00000-0000-4000-8000-000000000007\",\n rentity_id: \"FIU-US-00123\",\n currency_code_local: \"USD\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.UpdateAsync(\"5ec00000-0000-4000-8000-000000000007\", new RegulatoryReportsUpdateParams\n{\n RentityId = \"FIU-US-00123\",\n CurrencyCodeLocal = \"USD\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -40860,6 +46384,36 @@ "lang": "curl", "label": "curl (finalized report)", "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"confirm_delete\": true}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.regulatory_reports.delete(\n \"5ec00000-0000-4000-8000-000000000007\",\n confirm_delete=True,\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.regulatoryReports.delete(\"5ec00000-0000-4000-8000-000000000007\", {\n confirm_delete: true,\n});" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.RegulatoryReportsDeleteParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.regulatoryReports().delete(\"5ec00000-0000-4000-8000-000000000007\", RegulatoryReportsDeleteParams.builder()\n .confirmDelete(true)\n .build());" + }, + { + "lang": "php", + "label": "PHP", + "source": "regulatoryReports->delete('5ec00000-0000-4000-8000-000000000007', [\n 'confirm_delete' => true,\n]);" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.regulatory_reports.delete(\n \"5ec00000-0000-4000-8000-000000000007\",\n confirm_delete: true\n)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.RegulatoryReports.DeleteAsync(\"5ec00000-0000-4000-8000-000000000007\", new RegulatoryReportsDeleteParams\n{\n ConfirmDelete = true,\n});" } ], "responses": { @@ -40985,6 +46539,9 @@ "example": { "confirm_delete": true } + }, + "example": { + "confirm_delete": true } } } @@ -41044,6 +46601,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/validate/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.validate(\n \"5ec00000-0000-4000-8000-000000000007\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.validate(\"5ec00000-0000-4000-8000-000000000007\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.Validate(ctx, \"5ec00000-0000-4000-8000-000000000007\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().validate(\"5ec00000-0000-4000-8000-000000000007\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "regulatoryReports->validate('5ec00000-0000-4000-8000-000000000007');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.validate(\"5ec00000-0000-4000-8000-000000000007\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.ValidateAsync(\"5ec00000-0000-4000-8000-000000000007\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -41150,7 +46742,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/finalize/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=30,\n)\nif resp.status_code == 400:\n print('Validation failed:', resp.json()['errors'])\nelse:\n resp.raise_for_status()\n report = resp.json()\n print(report['status'], report['report_number'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.finalize(\n \"5ec00000-0000-4000-8000-000000000007\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.finalize(\"5ec00000-0000-4000-8000-000000000007\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.Finalize(ctx, \"5ec00000-0000-4000-8000-000000000007\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().finalize_(\"5ec00000-0000-4000-8000-000000000007\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "regulatoryReports->finalize('5ec00000-0000-4000-8000-000000000007');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.finalize(\"5ec00000-0000-4000-8000-000000000007\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.FinalizeAsync(\"5ec00000-0000-4000-8000-000000000007\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -41282,6 +46904,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/download-url/?file=xml' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.retrieve_download_url(\n \"5ec00000-0000-4000-8000-000000000007\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.retrieveDownloadUrl(\"5ec00000-0000-4000-8000-000000000007\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.RetrieveDownloadURL(ctx, \"5ec00000-0000-4000-8000-000000000007\", didit.RegulatoryReportsRetrieveDownloadURLParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().retrieveDownloadUrl(\"5ec00000-0000-4000-8000-000000000007\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "regulatoryReports->retrieveDownloadUrl('5ec00000-0000-4000-8000-000000000007');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.retrieve_download_url(\"5ec00000-0000-4000-8000-000000000007\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.RetrieveDownloadUrlAsync(\"5ec00000-0000-4000-8000-000000000007\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -41472,6 +47129,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/transactions/rules/?source=CUSTOM&ordering=-run_count' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.transactions.rules.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.transactions.rules.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Transactions.Rules.ListAutoPaging(ctx, didit.TransactionsRulesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.transactions().rules().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->rules->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.rules.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Transactions.Rules.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ] }, @@ -41599,12 +47291,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nrule = {\n \"title\": \"Structuring - inbound (custom)\",\n \"description\": \"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\",\n \"category\": \"finance\",\n \"mode\": \"TEST\",\n \"evaluation_mode\": \"ALL\",\n \"scope\": {\n \"transaction_types\": [\n \"finance\"\n ],\n \"directions\": [\n \"INBOUND\"\n ]\n },\n \"conditions\": [\n {\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\"\n },\n {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000\n }\n ],\n \"aggregation\": [\n {\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n },\n {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n }\n ],\n \"actions\": [\n {\n \"type\": \"add_score\",\n \"value\": 35\n }\n ]\n}\n\nresp = requests.post(\n 'https://verification.didit.me/v3/transactions/rules/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json=rule,\n timeout=15,\n)\nresp.raise_for_status()\nprint(resp.json()['uuid'], resp.json()['mode'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.create(\n title=\"Structuring - inbound (custom)\",\n description=\"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\",\n category=\"finance\",\n mode=\"TEST\",\n evaluation_mode=\"ALL\",\n scope={\n \"transaction_types\": [\"finance\"],\n \"directions\": [\"INBOUND\"],\n },\n conditions=[{\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\",\n }, {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n }],\n aggregation=[{\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20.0,\n \"window\": \"30d\",\n \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"},\n }, {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000.0,\n \"window\": \"30d\",\n \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"},\n }],\n actions=[{\n \"type\": \"add_score\",\n \"value\": 35,\n }],\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const rule = {\n \"title\": \"Structuring - inbound (custom)\",\n \"description\": \"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\",\n \"category\": \"finance\",\n \"mode\": \"TEST\",\n \"evaluation_mode\": \"ALL\",\n \"scope\": {\n \"transaction_types\": [\n \"finance\"\n ],\n \"directions\": [\n \"INBOUND\"\n ]\n },\n \"conditions\": [\n {\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\"\n },\n {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000\n }\n ],\n \"aggregation\": [\n {\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n },\n {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n }\n ],\n \"actions\": [\n {\n \"type\": \"add_score\",\n \"value\": 35\n }\n ]\n};\n\nconst resp = await fetch('https://verification.didit.me/v3/transactions/rules/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(rule),\n});\nif (!resp.ok) throw new Error(await resp.text());\nconst created = await resp.json();\nconsole.log(created.uuid, created.mode);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.create({\n title: \"Structuring - inbound (custom)\",\n description: \"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\",\n category: \"finance\",\n mode: \"TEST\",\n evaluation_mode: \"ALL\",\n scope: {\n transaction_types: [\"finance\"],\n directions: [\"INBOUND\"],\n },\n conditions: [{\n field: \"currency\",\n operator: \"eq\",\n value: \"EUR\",\n }, {\n field: \"amount\",\n operator: \"lt\",\n value: 10000,\n }],\n aggregation: [{\n metric: \"count\",\n operator: \"gte\",\n value: 20.0,\n window: \"30d\",\n filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n }, {\n metric: \"max\",\n field: \"amount\",\n operator: \"lt\",\n value: 10000.0,\n window: \"30d\",\n filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n }],\n actions: [{\n type: \"add_score\",\n value: 35,\n }],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.Create(ctx, didit.TransactionRuleCreateRequest{\n\tTitle: \"Structuring - inbound (custom)\",\n\tDescription: didit.String(\"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\"),\n\tCategory: \"finance\",\n\tMode: \"TEST\",\n\tEvaluationMode: didit.Some(didit.TransactionRuleCreateRequestEvaluationMode(\"ALL\")),\n\tScope: didit.Some(didit.TransactionRuleScopeParam{\n\t\tTransactionTypes: didit.Some([]string{\"finance\"}),\n\t\tDirections: didit.Some([]didit.TransactionRuleScopeDirections{\"INBOUND\"}),\n\t}),\n\tConditions: didit.Some([]didit.TransactionRuleConditionParam{{\n\t\tField: \"currency\",\n\t\tOperator: \"eq\",\n\t\tValue: didit.Some[any](\"EUR\"),\n\t}, {\n\t\tField: \"amount\",\n\t\tOperator: \"lt\",\n\t\tValue: didit.Some[any](10000),\n\t}}),\n\tAggregation: didit.Some([]didit.TransactionRuleAggregationParam{{\n\t\tMetric: didit.Some(didit.TransactionRuleAggregationMetric(\"count\")),\n\t\tOperator: didit.Some(didit.TransactionRuleAggregationOperator(\"gte\")),\n\t\tValue: 20.0,\n\t\tWindow: didit.String(\"30d\"),\n\t\tFilters: didit.Some(map[string]any{\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}),\n\t}, {\n\t\tMetric: didit.Some(didit.TransactionRuleAggregationMetric(\"max\")),\n\t\tField: didit.String(\"amount\"),\n\t\tOperator: didit.Some(didit.TransactionRuleAggregationOperator(\"lt\")),\n\t\tValue: 10000.0,\n\t\tWindow: didit.String(\"30d\"),\n\t\tFilters: didit.Some(map[string]any{\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}),\n\t}}),\n\tActions: didit.Some([]didit.TransactionRuleActionParam{{\n\t\tType: \"add_score\",\n\t\tValue: didit.Some[any](35),\n\t}}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.TransactionRuleAction;\nimport me.didit.types.TransactionRuleActionAddScore;\nimport me.didit.types.TransactionRuleAggregation;\nimport me.didit.types.TransactionRuleCondition;\nimport me.didit.types.TransactionRuleCreateRequest;\nimport me.didit.types.TransactionRuleScope;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().create(TransactionRuleCreateRequest.builder()\n .title(\"Structuring - inbound (custom)\")\n .description(\"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\")\n .category(\"finance\")\n .mode(TransactionRuleCreateRequest.Mode.of(\"TEST\"))\n .evaluationMode(TransactionRuleCreateRequest.EvaluationMode.of(\"ALL\"))\n .scope(TransactionRuleScope.builder()\n .transactionTypes(List.of(\"finance\"))\n .directions(List.of(TransactionRuleScope.Directions.of(\"INBOUND\")))\n .build())\n .conditions(List.of(\n TransactionRuleCondition.builder()\n .field(\"currency\")\n .operator(TransactionRuleCondition.Operator.of(\"eq\"))\n .value(\"EUR\")\n .build(),\n TransactionRuleCondition.builder()\n .field(\"amount\")\n .operator(TransactionRuleCondition.Operator.of(\"lt\"))\n .value(10000)\n .build()))\n .aggregation(List.of(\n TransactionRuleAggregation.builder()\n .metric(TransactionRuleAggregation.Metric.of(\"count\"))\n .operator(TransactionRuleAggregation.Operator.of(\"gte\"))\n .value(20.0)\n .window(\"30d\")\n .filters(Map.of(\"direction\", \"INBOUND\", \"transaction_type\", \"finance\", \"subject_vendor_data\", \"__current__\", \"currency\", \"EUR\"))\n .build(),\n TransactionRuleAggregation.builder()\n .metric(TransactionRuleAggregation.Metric.of(\"max\"))\n .field(\"amount\")\n .operator(TransactionRuleAggregation.Operator.of(\"lt\"))\n .value(10000.0)\n .window(\"30d\")\n .filters(Map.of(\"direction\", \"INBOUND\", \"transaction_type\", \"finance\", \"subject_vendor_data\", \"__current__\", \"currency\", \"EUR\"))\n .build()))\n .actions(List.of(TransactionRuleAction.ofAddScore(TransactionRuleActionAddScore.builder()\n .type(TransactionRuleActionAddScore.Type.of(\"add_score\"))\n .value(35L)\n .build())))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->rules->create([\n 'title' => 'Structuring - inbound (custom)',\n 'description' => '20+ inbound EUR transfers, all under 10,000 EUR, 30 days',\n 'category' => 'finance',\n 'mode' => 'TEST',\n 'evaluation_mode' => 'ALL',\n 'scope' => [\n 'transaction_types' => ['finance'],\n 'directions' => ['INBOUND'],\n ],\n 'conditions' => [[\n 'field' => 'currency',\n 'operator' => 'eq',\n 'value' => 'EUR',\n ], [\n 'field' => 'amount',\n 'operator' => 'lt',\n 'value' => 10000,\n ]],\n 'aggregation' => [[\n 'metric' => 'count',\n 'operator' => 'gte',\n 'value' => 20.0,\n 'window' => '30d',\n 'filters' => ['direction' => 'INBOUND', 'transaction_type' => 'finance', 'subject_vendor_data' => '__current__', 'currency' => 'EUR'],\n ], [\n 'metric' => 'max',\n 'field' => 'amount',\n 'operator' => 'lt',\n 'value' => 10000.0,\n 'window' => '30d',\n 'filters' => ['direction' => 'INBOUND', 'transaction_type' => 'finance', 'subject_vendor_data' => '__current__', 'currency' => 'EUR'],\n ]],\n 'actions' => [[\n 'type' => 'add_score',\n 'value' => 35,\n ]],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.create(\n title: \"Structuring - inbound (custom)\",\n description: \"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\",\n category: \"finance\",\n mode: \"TEST\",\n evaluation_mode: \"ALL\",\n scope: {\n transaction_types: [\"finance\"],\n directions: [\"INBOUND\"],\n },\n conditions: [{\n field: \"currency\",\n operator: \"eq\",\n value: \"EUR\",\n }, {\n field: \"amount\",\n operator: \"lt\",\n value: 10000,\n }],\n aggregation: [{\n metric: \"count\",\n operator: \"gte\",\n value: 20.0,\n window: \"30d\",\n filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n }, {\n metric: \"max\",\n field: \"amount\",\n operator: \"lt\",\n value: 10000.0,\n window: \"30d\",\n filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n }],\n actions: [{\n type: \"add_score\",\n value: 35,\n }]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.CreateAsync(new TransactionRuleCreateRequest\n{\n Title = \"Structuring - inbound (custom)\",\n Description = \"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\",\n Category = \"finance\",\n Mode = \"TEST\",\n EvaluationMode = new TransactionRuleCreateRequestEvaluationMode(\"ALL\"),\n Scope = new TransactionRuleScope\n {\n TransactionTypes = new string[] { \"finance\" },\n Directions = new TransactionRuleScopeDirections[] { \"INBOUND\" },\n },\n Conditions = new TransactionRuleCondition[]\n {\n new()\n {\n Field = \"currency\",\n Operator = \"eq\",\n Value = \"EUR\",\n },\n new()\n {\n Field = \"amount\",\n Operator = \"lt\",\n Value = 10000,\n },\n },\n Aggregation = new TransactionRuleAggregation[]\n {\n new()\n {\n Metric = new TransactionRuleAggregationMetric(\"count\"),\n Operator = new TransactionRuleAggregationOperator(\"gte\"),\n Value = 20.0,\n Window = \"30d\",\n Filters = new Dictionary { [\"direction\"] = \"INBOUND\", [\"transaction_type\"] = \"finance\", [\"subject_vendor_data\"] = \"__current__\", [\"currency\"] = \"EUR\" },\n },\n new()\n {\n Metric = new TransactionRuleAggregationMetric(\"max\"),\n Field = \"amount\",\n Operator = new TransactionRuleAggregationOperator(\"lt\"),\n Value = 10000.0,\n Window = \"30d\",\n Filters = new Dictionary { [\"direction\"] = \"INBOUND\", [\"transaction_type\"] = \"finance\", [\"subject_vendor_data\"] = \"__current__\", [\"currency\"] = \"EUR\" },\n },\n },\n Actions = new TransactionRuleAction[]\n {\n new()\n {\n Type = new TransactionRuleActionType(\"add_score\"),\n Value = 35,\n },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -41667,6 +47384,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/transactions/rules/RULE_UUID/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.retrieve(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->rules->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] }, @@ -41732,7 +47484,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.patch(\n 'https://verification.didit.me/v3/transactions/rules/RULE_UUID/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={'mode': 'ACTIVE'},\n timeout=15,\n)\nresp.raise_for_status()\nprint(resp.json()['mode'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.update(\n \"11111111-2222-3333-4444-555555555555\",\n mode=\"ACTIVE\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.update(\"11111111-2222-3333-4444-555555555555\", {\n mode: \"ACTIVE\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TransactionRuleUpdateRequest{\n\tMode: didit.Some(didit.TransactionRuleUpdateRequestMode(\"ACTIVE\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TransactionRuleUpdateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().update(\"11111111-2222-3333-4444-555555555555\", TransactionRuleUpdateRequest.builder()\n .mode(TransactionRuleUpdateRequest.Mode.of(\"ACTIVE\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->rules->update('11111111-2222-3333-4444-555555555555', [\n 'mode' => 'ACTIVE',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.update(\n \"11111111-2222-3333-4444-555555555555\",\n mode: \"ACTIVE\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new TransactionRuleUpdateRequest\n{\n Mode = new TransactionRuleUpdateRequestMode(\"ACTIVE\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] }, @@ -41787,6 +47569,41 @@ "lang": "curl", "label": "curl", "source": "curl -X DELETE 'https://verification.didit.me/v3/transactions/rules/RULE_UUID/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.transactions.rules.delete(\n \"11111111-2222-3333-4444-555555555555\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.transactions.rules.delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Transactions.Rules.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.transactions().rules().delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->rules->delete('11111111-2222-3333-4444-555555555555');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.rules.delete(\"11111111-2222-3333-4444-555555555555\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Transactions.Rules.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");" } ] } @@ -41898,7 +47715,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/transactions/rules/backtest/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={\n \"conditions\": [\n {\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\"\n },\n {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000\n }\n ],\n \"aggregation\": [\n {\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n },\n {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n }\n ],\n \"evaluation_mode\": \"ALL\",\n \"scope\": {\n \"transaction_types\": [\n \"finance\"\n ],\n \"directions\": [\n \"INBOUND\"\n ]\n },\n \"period_days\": 90\n},\n timeout=30,\n)\nresp.raise_for_status()\nstats = resp.json()\nprint(stats['matched'], 'matches across', stats['affected_entities'], 'subjects')" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.backtest(\n conditions=[{\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\",\n }, {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n }],\n aggregation=[{\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20.0,\n \"window\": \"30d\",\n \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"},\n }, {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000.0,\n \"window\": \"30d\",\n \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"},\n }],\n evaluation_mode=\"ALL\",\n scope={\n \"transaction_types\": [\"finance\"],\n \"directions\": [\"INBOUND\"],\n },\n period_days=90,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.backtest({\n conditions: [{\n field: \"currency\",\n operator: \"eq\",\n value: \"EUR\",\n }, {\n field: \"amount\",\n operator: \"lt\",\n value: 10000,\n }],\n aggregation: [{\n metric: \"count\",\n operator: \"gte\",\n value: 20.0,\n window: \"30d\",\n filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n }, {\n metric: \"max\",\n field: \"amount\",\n operator: \"lt\",\n value: 10000.0,\n window: \"30d\",\n filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n }],\n evaluation_mode: \"ALL\",\n scope: {\n transaction_types: [\"finance\"],\n directions: [\"INBOUND\"],\n },\n period_days: 90,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.Backtest(ctx, didit.TransactionRuleBacktestRequest{\n\tConditions: didit.Some([]didit.TransactionRuleConditionParam{{\n\t\tField: \"currency\",\n\t\tOperator: \"eq\",\n\t\tValue: didit.Some[any](\"EUR\"),\n\t}, {\n\t\tField: \"amount\",\n\t\tOperator: \"lt\",\n\t\tValue: didit.Some[any](10000),\n\t}}),\n\tAggregation: didit.Some([]didit.TransactionRuleAggregationParam{{\n\t\tMetric: didit.Some(didit.TransactionRuleAggregationMetric(\"count\")),\n\t\tOperator: didit.Some(didit.TransactionRuleAggregationOperator(\"gte\")),\n\t\tValue: 20.0,\n\t\tWindow: didit.String(\"30d\"),\n\t\tFilters: didit.Some(map[string]any{\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}),\n\t}, {\n\t\tMetric: didit.Some(didit.TransactionRuleAggregationMetric(\"max\")),\n\t\tField: didit.String(\"amount\"),\n\t\tOperator: didit.Some(didit.TransactionRuleAggregationOperator(\"lt\")),\n\t\tValue: 10000.0,\n\t\tWindow: didit.String(\"30d\"),\n\t\tFilters: didit.Some(map[string]any{\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}),\n\t}}),\n\tEvaluationMode: didit.Some(didit.TransactionRuleBacktestRequestEvaluationMode(\"ALL\")),\n\tScope: didit.Some(didit.TransactionRuleScopeParam{\n\t\tTransactionTypes: didit.Some([]string{\"finance\"}),\n\t\tDirections: didit.Some([]didit.TransactionRuleScopeDirections{\"INBOUND\"}),\n\t}),\n\tPeriodDays: didit.Int(90),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.TransactionRuleAggregation;\nimport me.didit.types.TransactionRuleBacktestRequest;\nimport me.didit.types.TransactionRuleCondition;\nimport me.didit.types.TransactionRuleScope;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().backtest(TransactionRuleBacktestRequest.builder()\n .conditions(List.of(\n TransactionRuleCondition.builder()\n .field(\"currency\")\n .operator(TransactionRuleCondition.Operator.of(\"eq\"))\n .value(\"EUR\")\n .build(),\n TransactionRuleCondition.builder()\n .field(\"amount\")\n .operator(TransactionRuleCondition.Operator.of(\"lt\"))\n .value(10000)\n .build()))\n .aggregation(List.of(\n TransactionRuleAggregation.builder()\n .metric(TransactionRuleAggregation.Metric.of(\"count\"))\n .operator(TransactionRuleAggregation.Operator.of(\"gte\"))\n .value(20.0)\n .window(\"30d\")\n .filters(Map.of(\"direction\", \"INBOUND\", \"transaction_type\", \"finance\", \"subject_vendor_data\", \"__current__\", \"currency\", \"EUR\"))\n .build(),\n TransactionRuleAggregation.builder()\n .metric(TransactionRuleAggregation.Metric.of(\"max\"))\n .field(\"amount\")\n .operator(TransactionRuleAggregation.Operator.of(\"lt\"))\n .value(10000.0)\n .window(\"30d\")\n .filters(Map.of(\"direction\", \"INBOUND\", \"transaction_type\", \"finance\", \"subject_vendor_data\", \"__current__\", \"currency\", \"EUR\"))\n .build()))\n .evaluationMode(TransactionRuleBacktestRequest.EvaluationMode.of(\"ALL\"))\n .scope(TransactionRuleScope.builder()\n .transactionTypes(List.of(\"finance\"))\n .directions(List.of(TransactionRuleScope.Directions.of(\"INBOUND\")))\n .build())\n .periodDays(90L)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->rules->backtest([\n 'conditions' => [[\n 'field' => 'currency',\n 'operator' => 'eq',\n 'value' => 'EUR',\n ], [\n 'field' => 'amount',\n 'operator' => 'lt',\n 'value' => 10000,\n ]],\n 'aggregation' => [[\n 'metric' => 'count',\n 'operator' => 'gte',\n 'value' => 20.0,\n 'window' => '30d',\n 'filters' => ['direction' => 'INBOUND', 'transaction_type' => 'finance', 'subject_vendor_data' => '__current__', 'currency' => 'EUR'],\n ], [\n 'metric' => 'max',\n 'field' => 'amount',\n 'operator' => 'lt',\n 'value' => 10000.0,\n 'window' => '30d',\n 'filters' => ['direction' => 'INBOUND', 'transaction_type' => 'finance', 'subject_vendor_data' => '__current__', 'currency' => 'EUR'],\n ]],\n 'evaluation_mode' => 'ALL',\n 'scope' => [\n 'transaction_types' => ['finance'],\n 'directions' => ['INBOUND'],\n ],\n 'period_days' => 90,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.backtest(\n conditions: [{\n field: \"currency\",\n operator: \"eq\",\n value: \"EUR\",\n }, {\n field: \"amount\",\n operator: \"lt\",\n value: 10000,\n }],\n aggregation: [{\n metric: \"count\",\n operator: \"gte\",\n value: 20.0,\n window: \"30d\",\n filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n }, {\n metric: \"max\",\n field: \"amount\",\n operator: \"lt\",\n value: 10000.0,\n window: \"30d\",\n filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n }],\n evaluation_mode: \"ALL\",\n scope: {\n transaction_types: [\"finance\"],\n directions: [\"INBOUND\"],\n },\n period_days: 90\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.BacktestAsync(new TransactionRuleBacktestRequest\n{\n Conditions = new TransactionRuleCondition[]\n {\n new()\n {\n Field = \"currency\",\n Operator = \"eq\",\n Value = \"EUR\",\n },\n new()\n {\n Field = \"amount\",\n Operator = \"lt\",\n Value = 10000,\n },\n },\n Aggregation = new TransactionRuleAggregation[]\n {\n new()\n {\n Metric = new TransactionRuleAggregationMetric(\"count\"),\n Operator = new TransactionRuleAggregationOperator(\"gte\"),\n Value = 20.0,\n Window = \"30d\",\n Filters = new Dictionary { [\"direction\"] = \"INBOUND\", [\"transaction_type\"] = \"finance\", [\"subject_vendor_data\"] = \"__current__\", [\"currency\"] = \"EUR\" },\n },\n new()\n {\n Metric = new TransactionRuleAggregationMetric(\"max\"),\n Field = \"amount\",\n Operator = new TransactionRuleAggregationOperator(\"lt\"),\n Value = 10000.0,\n Window = \"30d\",\n Filters = new Dictionary { [\"direction\"] = \"INBOUND\", [\"transaction_type\"] = \"finance\", [\"subject_vendor_data\"] = \"__current__\", [\"currency\"] = \"EUR\" },\n },\n },\n EvaluationMode = new TransactionRuleBacktestRequestEvaluationMode(\"ALL\"),\n Scope = new TransactionRuleScope\n {\n TransactionTypes = new string[] { \"finance\" },\n Directions = new TransactionRuleScopeDirections[] { \"INBOUND\" },\n },\n PeriodDays = 90,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -42005,6 +47852,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/transactions/rules/library/?bundle=finance' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.transactions.rules.list_library():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.transactions.rules.listLibrary()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Transactions.Rules.ListLibraryAutoPaging(ctx, didit.TransactionsRulesListLibraryParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.transactions().rules().listLibrary()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->rules->listLibrary() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.rules.list_library.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Transactions.Rules.ListLibraryAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ] } @@ -42078,6 +47960,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/transactions/rules/install/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"library_keys\": [\"structuring-inbound\", \"structuring-outbound\"]}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.install_library(\n library_keys=[\"structuring-inbound\", \"structuring-outbound\"],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.installLibrary({\n library_keys: [\"structuring-inbound\", \"structuring-outbound\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.InstallLibrary(ctx, didit.TransactionRuleInstallRequest{\n\tLibraryKeys: didit.Some([]string{\"structuring-inbound\", \"structuring-outbound\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.TransactionRuleInstallRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().installLibrary(TransactionRuleInstallRequest.builder()\n .libraryKeys(List.of(\"structuring-inbound\", \"structuring-outbound\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->rules->installLibrary([\n 'library_keys' => ['structuring-inbound', 'structuring-outbound'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.install_library(library_keys: [\"structuring-inbound\", \"structuring-outbound\"])\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.InstallLibraryAsync(new TransactionRuleInstallRequest\n{\n LibraryKeys = new string[] { \"structuring-inbound\", \"structuring-outbound\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] }, @@ -42142,6 +48059,41 @@ "lang": "curl", "label": "curl", "source": "curl -X DELETE 'https://verification.didit.me/v3/transactions/rules/install/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"bundle\": \"responsible_gaming\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.uninstall_library(\n bundle=\"responsible_gaming\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.uninstallLibrary({\n bundle: \"responsible_gaming\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.UninstallLibrary(ctx, didit.TransactionRuleInstallRequest{\n\tBundle: didit.String(\"responsible_gaming\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TransactionRuleInstallRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().uninstallLibrary(TransactionRuleInstallRequest.builder()\n .bundle(\"responsible_gaming\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->rules->uninstallLibrary([\n 'bundle' => 'responsible_gaming',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.uninstall_library(bundle: \"responsible_gaming\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.UninstallLibraryAsync(new TransactionRuleInstallRequest\n{\n Bundle = \"responsible_gaming\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -42346,6 +48298,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/?status=active,in_review&ordering=-risk_score' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.networks.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.networks.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Networks.ListAutoPaging(ctx, didit.NetworksListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.networks().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.networks.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Networks.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -42596,6 +48583,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.retrieve(\n \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.retrieve(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.Retrieve(ctx, \"n3a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().retrieve(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->retrieve('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.retrieve(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.RetrieveAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -42911,6 +48933,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/graph/?depth=2' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.retrieve_graph(\n \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.retrieveGraph(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.RetrieveGraph(ctx, \"n3a5e000-0000-4000-8000-000000000001\", didit.NetworksRetrieveGraphParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().retrieveGraph(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->retrieveGraph('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.retrieve_graph(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.RetrieveGraphAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -43000,108 +49057,46 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/members/' \\\n -H 'x-api-key: YOUR_API_KEY'" - } - ], - "responses": { - "200": { - "description": "Network members. Not paginated.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NetworkMember" - } - } - } - } - } - } }, - "404": { - "description": "Network not found (or not visible to this application).", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "detail": { - "type": "string" - } - } - } - } - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ] - } - }, - "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/signals/": { - "get": { - "summary": "List network signals", - "description": "List the signals (shared device, IP, face, document number, phone, email, or address values) that link this network's members.", - "operationId": "list_network_signals", - "x-didit-sdk": { - "resource": "networks", - "method": "list_signals", - "auth": "api_key", - "server": true, - "scope": "application" - }, - "tags": [ - "Networks" - ], - "parameters": [ + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.list_members(\n \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, { - "name": "organization_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "Organization UUID." + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.listMembers(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" }, { - "name": "application_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "Application UUID." + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.ListMembers(ctx, \"n3a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" }, { - "name": "network_uuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "example": "n3a5e000-0000-4000-8000-000000000001" - }, - "description": "Network UUID." - } - ], - "x-codeSamples": [ + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().listMembers(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, { - "lang": "curl", - "label": "curl", - "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/signals/' \\\n -H 'x-api-key: YOUR_API_KEY'" + "lang": "php", + "label": "PHP", + "source": "networks->listMembers('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.list_members(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.ListMembersAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { "200": { - "description": "Network signals. Not paginated.", + "description": "Network members. Not paginated.", "content": { "application/json": { "schema": { @@ -43110,7 +49105,7 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/NetworkSignal" + "$ref": "#/components/schemas/NetworkMember" } } } @@ -43141,14 +49136,146 @@ ] } }, - "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/timeline/": { + "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/signals/": { "get": { - "summary": "Get network timeline", - "description": "Without `contract`: the network's own events (detection, each signal's latest observation and its review), oldest first and not paginated. `limit`, `cursor` and `event_type` are ignored. With `contract=2`: the typed timeline, newest first and paginated by cursor. It adds what the member accounts did (verification attempts, transactions, sign-ins you post through the events API and the live rules they hit) and the cases opened for the network. `note_added` events are returned to console members only, never to an API key. Requires a full-access API key, or `read:networks` for a console member.", - "operationId": "get_network_timeline", + "summary": "List network signals", + "description": "List the signals (shared device, IP, face, document number, phone, email, or address values) that link this network's members.", + "operationId": "list_network_signals", "x-didit-sdk": { "resource": "networks", - "method": "retrieve_timeline", + "method": "list_signals", + "auth": "api_key", + "server": true, + "scope": "application" + }, + "tags": [ + "Networks" + ], + "parameters": [ + { + "name": "organization_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "Organization UUID." + }, + { + "name": "application_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "Application UUID." + }, + { + "name": "network_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "example": "n3a5e000-0000-4000-8000-000000000001" + }, + "description": "Network UUID." + } + ], + "x-codeSamples": [ + { + "lang": "curl", + "label": "curl", + "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/signals/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.list_signals(\n \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.listSignals(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.ListSignals(ctx, \"n3a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().listSignals(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->listSignals('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.list_signals(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.ListSignalsAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ], + "responses": { + "200": { + "description": "Network signals. Not paginated.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NetworkSignal" + } + } + } + } + } + } + }, + "404": { + "description": "Network not found (or not visible to this application).", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string" + } + } + } + } + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ] + } + }, + "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/timeline/": { + "get": { + "summary": "Get network timeline", + "description": "Without `contract`: the network's own events (detection, each signal's latest observation and its review), oldest first and not paginated. `limit`, `cursor` and `event_type` are ignored. With `contract=2`: the typed timeline, newest first and paginated by cursor. It adds what the member accounts did (verification attempts, transactions, sign-ins you post through the events API and the live rules they hit) and the cases opened for the network. `note_added` events are returned to console members only, never to an API key. Requires a full-access API key, or `read:networks` for a console member.", + "operationId": "get_network_timeline", + "x-didit-sdk": { + "resource": "networks", + "method": "retrieve_timeline", "auth": "api_key", "server": true, "scope": "application" @@ -43261,6 +49388,41 @@ "lang": "curl", "label": "curl (typed timeline)", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/3fa85f64-5717-4562-b3fc-2c963f66afa6/timeline/?contract=2&limit=50&event_type=verification_attempt,login' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.retrieve_timeline(\n \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.retrieveTimeline(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.RetrieveTimeline(ctx, \"n3a5e000-0000-4000-8000-000000000001\", didit.NetworksRetrieveTimelineParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().retrieveTimeline(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->retrieveTimeline('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.retrieve_timeline(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.RetrieveTimelineAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -43625,6 +49787,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/map/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.retrieve_map(\n \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.retrieveMap(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.RetrieveMap(ctx, \"n3a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().retrieveMap(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->retrieveMap('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.retrieve_map(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.RetrieveMapAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -43713,6 +49910,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/sessions/aaaaaaaa-0000-4000-8000-000000000001/networks/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.sessions.list_networks(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.sessions.listNetworks(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ListNetworks(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.sessions().listNetworks(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->listNetworks('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.sessions.list_networks(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ListNetworksAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -43801,94 +50033,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/business-sessions/aaaaaaaa-0000-4000-8000-000000000002/networks/' \\\n -H 'x-api-key: YOUR_API_KEY'" - } - ], - "responses": { - "200": { - "description": "Networks this entity belongs to. Not paginated.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EntityNetworkMembershipList" - } - } - } }, - "404": { - "description": "Entity not found in this application, or has no linked subject to look up.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "detail": { - "type": "string" - } - } - } - } - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ] - } - }, - "/v3/organization/{organization_id}/application/{application_id}/users/{vendor_user_uuid}/networks/": { - "get": { - "summary": "List networks for a user", - "description": "List the networks a vendor user belongs to.", - "operationId": "list_user_network_memberships", - "x-didit-sdk": { - "resource": "users", - "method": "list_networks", - "auth": "api_key", - "server": true, - "scope": "application" - }, - "tags": [ - "Networks" - ], - "parameters": [ + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.business_sessions.list_networks(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, { - "name": "organization_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "Organization UUID." + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businessSessions.listNetworks(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" }, { - "name": "application_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "Application UUID." + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.BusinessSessions.ListNetworks(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" }, { - "name": "vendor_user_uuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "Vendor user UUID." - } - ], - "x-codeSamples": [ + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businessSessions().listNetworks(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, { - "lang": "curl", - "label": "curl", - "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/users/aaaaaaaa-0000-4000-8000-000000000003/networks/' \\\n -H 'x-api-key: YOUR_API_KEY'" + "lang": "php", + "label": "PHP", + "source": "businessSessions->listNetworks('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.business_sessions.list_networks(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.BusinessSessions.ListNetworksAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -43925,13 +50104,136 @@ ] } }, - "/v3/organization/{organization_id}/application/{application_id}/businesses/{vendor_business_uuid}/networks/": { + "/v3/organization/{organization_id}/application/{application_id}/users/{vendor_user_uuid}/networks/": { "get": { - "summary": "List networks for a business", - "description": "List the networks a vendor business belongs to.", - "operationId": "list_business_network_memberships", + "summary": "List networks for a user", + "description": "List the networks a vendor user belongs to.", + "operationId": "list_user_network_memberships", "x-didit-sdk": { - "resource": "businesses", + "resource": "users", + "method": "list_networks", + "auth": "api_key", + "server": true, + "scope": "application" + }, + "tags": [ + "Networks" + ], + "parameters": [ + { + "name": "organization_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "Organization UUID." + }, + { + "name": "application_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "Application UUID." + }, + { + "name": "vendor_user_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "Vendor user UUID." + } + ], + "x-codeSamples": [ + { + "lang": "curl", + "label": "curl", + "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/users/aaaaaaaa-0000-4000-8000-000000000003/networks/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.users.list_networks(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.users.listNetworks(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Users.ListNetworks(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.users().listNetworks(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "users->listNetworks('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.users.list_networks(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Users.ListNetworksAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ], + "responses": { + "200": { + "description": "Networks this entity belongs to. Not paginated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntityNetworkMembershipList" + } + } + } + }, + "404": { + "description": "Entity not found in this application, or has no linked subject to look up.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string" + } + } + } + } + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ] + } + }, + "/v3/organization/{organization_id}/application/{application_id}/businesses/{vendor_business_uuid}/networks/": { + "get": { + "summary": "List networks for a business", + "description": "List the networks a vendor business belongs to.", + "operationId": "list_business_network_memberships", + "x-didit-sdk": { + "resource": "businesses", "method": "list_networks", "auth": "api_key", "server": true, @@ -43977,6 +50279,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/businesses/aaaaaaaa-0000-4000-8000-000000000004/networks/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.businesses.list_networks(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businesses.listNetworks(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.ListNetworks(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businesses().listNetworks(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->listNetworks('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.businesses.list_networks(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.ListNetworksAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -44065,6 +50402,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/transactions/aaaaaaaa-0000-4000-8000-000000000005/networks/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.transactions.list_networks(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.transactions.listNetworks(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.ListNetworks(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.transactions().listNetworks(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->listNetworks('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.transactions.list_networks(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.ListNetworksAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -44163,6 +50535,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/transactions/aaaaaaaa-0000-4000-8000-000000000005/parties/bbbbbbbb-0000-4000-8000-000000000006/networks/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.transactions.list_party_networks(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.transactions.listPartyNetworks(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.ListPartyNetworks(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.transactions().listPartyNetworks(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->listPartyNetworks('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.transactions.list_party_networks(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.ListPartyNetworksAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -44535,6 +50942,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/biometric-templates/?vendor_data=user-42&status=active' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.biometric_templates.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.biometricTemplates.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.BiometricTemplates.ListAutoPaging(ctx, didit.BiometricTemplatesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.biometricTemplates().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "biometricTemplates->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.biometric_templates.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.BiometricTemplates.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ] } @@ -44690,6 +51132,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/biometric-templates/count/?status=active' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.biometric_templates.count()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.biometricTemplates.count();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.BiometricTemplates.Count(ctx, didit.BiometricTemplatesCountParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.biometricTemplates().count();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "biometricTemplates->count();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.biometric_templates.count\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.BiometricTemplates.CountAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -44909,6 +51386,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/biometric-templates/9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.biometric_templates.retrieve(\n \"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.biometricTemplates.retrieve(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.BiometricTemplates.Retrieve(ctx, \"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.biometricTemplates().retrieve(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "biometricTemplates->retrieve('9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.biometric_templates.retrieve(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.BiometricTemplates.RetrieveAsync(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] }, @@ -45037,6 +51549,41 @@ "lang": "curl", "label": "curl", "source": "curl -X DELETE https://verification.didit.me/v3/biometric-templates/9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.biometric_templates.delete(\n \"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.biometricTemplates.delete(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.BiometricTemplates.Delete(ctx, \"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.biometricTemplates().delete(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "biometricTemplates->delete('9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.biometric_templates.delete(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.BiometricTemplates.DeleteAsync(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -45260,6 +51807,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/biometric-templates/delete/ \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"delete_all\": true, \"vendor_user_uuid\": \"2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.biometric_templates.batch_delete(\n template_uuids=[\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.biometricTemplates.batchDelete({\n template_uuids: [\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.BiometricTemplates.BatchDelete(ctx, didit.BiometricTemplatesBatchDeleteParams{\n\tTemplateUUIDs: didit.Some([]string{\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.BiometricTemplatesBatchDeleteParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.biometricTemplates().batchDelete(BiometricTemplatesBatchDeleteParams.builder()\n .templateUuids(List.of(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "biometricTemplates->batchDelete([\n 'template_uuids' => ['9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b', '1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.biometric_templates.batch_delete(template_uuids: [\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"])\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.BiometricTemplates.BatchDeleteAsync(new BiometricTemplatesBatchDeleteParams\n{\n TemplateUuids = new string[] { \"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -45283,13 +51865,17 @@ } ], "parameters": [], - "description": "Retrieve the Lite profile **plus the direct shareholders** (natural persons and corporate entities, with their ownership bands) of one candidate returned by `POST /v3/kyb/search/`.\n\n**Pairing with search.** Pass the candidate's `kyb_response_id` exactly as returned by a search of the same application. The search runs on the Lite registry chain; when the country's ownership data lives at another registry Didit re-finds the company there by registration number, at no extra cost.\n\n**Billing.** Billed at the country's Shareholders price - see [KYB registry pricing](/getting-started/kyb-registry-pricing). When the registry holds no shareholder record for the company (or the country offers no ownership data at all) the Lite profile is delivered and billed instead: read `registry_tier_delivered` and `registry_ownership_status`. The balance is checked against the Shareholders price before any registry call (`403` when short).\n\n**Availability.** v3 only. Every call creates a business session (its id is the `request_id`).\n\n**Pending reports.** When a report is still being prepared, or the ownership section has not been retrieved from the registry yet, the endpoint returns 202 Accepted, kyb_registry.fetch_status=pending, kyb_registry.registry_ownership_status=pending, and registry_tier_delivered=null. Keep request_id and retrieve GET /v3/session/{request_id}/decision/ until registry_checks[0].company.fetch_status is resolved. Didit completes the report automatically and charges the delivered tier once it is ready. Do not repeat the purchase while it is pending; every new POST creates a separate request.", + "description": "Retrieve the Lite profile **plus the direct shareholders** (natural persons and corporate entities, with their ownership bands) of one candidate returned by `POST /v3/kyb/search/`.\n\n**Pairing with search.** Pass the candidate's `kyb_response_id` exactly as returned by a search of the same application. Search at the tier you intend to buy (`tier` on `POST /v3/kyb/search/`), because the search runs on the registry chain that serves that tier and an empty Lite search is not proof that the registry does not hold the company. When the country's ownership data lives at another registry, Didit re-finds the company there by registration number, at no extra cost.\n\n**Billing.** Billed at the country's Shareholders price - see [KYB registry pricing](/getting-started/kyb-registry-pricing). When the registry holds no shareholder record for the company (or the country offers no ownership data at all) the Lite profile is delivered and billed instead: read `registry_tier_delivered` and `registry_ownership_status`. The balance is checked against the Shareholders price before any registry call (`403` when short).\n\n**Availability.** v3 only. Every call creates a business session (its id is the `request_id`).\n\n**Pending reports.** When a report is still being prepared, or the ownership section has not been retrieved from the registry yet, the endpoint returns 202 Accepted, kyb_registry.fetch_status=pending, kyb_registry.registry_ownership_status=pending, and registry_tier_delivered=null. Keep request_id and retrieve GET /v3/session/{request_id}/decision/ until registry_checks[0].company.fetch_status is resolved. Didit completes the report automatically and charges the delivered tier once it is ready. Do not repeat the purchase while it is pending; every new POST creates a separate request.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KYBRegistryCandidateRequest" + }, + "example": { + "kyb_response_id": "69aeeb95febb0f1704042259", + "vendor_data": "company-1234" } } } @@ -45303,12 +51889,37 @@ { "lang": "python", "label": "Python", - "source": "import os, time, requests\n\nsearch = requests.post(\n \"https://verification.didit.me/v3/kyb/search/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n json={\"country_code\": \"GB\", \"name\": \"Tesco\"},\n timeout=60,\n).json()\nkyb_response_id = search[\"kyb_registry\"][\"companies\"][0][\"kyb_response_id\"]\n\nresp = requests.post(\n \"https://verification.didit.me/v3/kyb/shareholders/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n json={\"kyb_response_id\": kyb_response_id, \"vendor_data\": \"company-1234\"},\n timeout=90,\n)\nresp.raise_for_status()\ndata = resp.json()\nrequest_id = data[\"request_id\"]\nprint(\"Keep this request ID:\", request_id)\ncompany = data[\"kyb_registry\"]\nif resp.status_code == 202 or company.get(\"fetch_status\") == \"pending\":\n # This client wait limit does not cancel the report or create a new purchase.\n deadline = time.monotonic() + 300\n while company.get(\"fetch_status\") != \"resolved\" and time.monotonic() < deadline:\n time.sleep(5)\n decision = requests.get(\n f\"https://verification.didit.me/v3/session/{request_id}/decision/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n timeout=30,\n )\n decision.raise_for_status()\n checks = decision.json().get(\"registry_checks\") or []\n if checks:\n company = checks[0].get(\"company\") or company\nif company.get(\"fetch_status\") == \"resolved\":\n print(company[\"company_name\"], company[\"registry_tier_delivered\"])\nelse:\n print(\"Still processing; retrieve this request later:\", request_id)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.kyb.list_shareholders(\n kyb_response_id=\"69aeeb95febb0f1704042259\",\n vendor_data=\"company-1234\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/kyb/shareholders/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n kyb_response_id: '69aeeb95febb0f1704042259',\n vendor_data: 'company-1234',\n }),\n});\nif (!res.ok) throw new Error(`Request failed: ${res.status}`);\nconst data = await res.json();\nconst requestId = data.request_id;\nconsole.log('Keep this request ID:', requestId);\nlet company = data.kyb_registry;\nif (res.status === 202 || company.fetch_status === 'pending') {\n // This client wait limit does not cancel the report or create a new purchase.\n const deadline = Date.now() + 300000;\n while (company.fetch_status !== 'resolved' && Date.now() < deadline) {\n await new Promise(resolve => setTimeout(resolve, 5000));\n const decisionResponse = await fetch(\n `https://verification.didit.me/v3/session/${requestId}/decision/`,\n { headers: { 'x-api-key': 'YOUR_API_KEY' }, signal: AbortSignal.timeout(30000) },\n );\n if (!decisionResponse.ok) throw new Error(`Retrieval failed: ${decisionResponse.status}`);\n const decision = await decisionResponse.json();\n company = decision.registry_checks?.[0]?.company ?? company;\n }\n}\nif (company.fetch_status === 'resolved') {\n console.log(company.company_name, company.registry_tier_delivered);\n} else {\n console.log('Still processing; retrieve this request later:', requestId);\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.kyb.listShareholders({\n kyb_response_id: \"69aeeb95febb0f1704042259\",\n vendor_data: \"company-1234\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.KYB.ListShareholders(ctx, didit.KYBRegistryCandidateRequest{\n\tKYBResponseID: \"69aeeb95febb0f1704042259\",\n\tVendorData: didit.String(\"company-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.KYBRegistryCandidateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.kyb().listShareholders(KYBRegistryCandidateRequest.builder()\n .kybResponseId(\"69aeeb95febb0f1704042259\")\n .vendorData(\"company-1234\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "kyb->listShareholders([\n 'kyb_response_id' => '69aeeb95febb0f1704042259',\n 'vendor_data' => 'company-1234',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.kyb.list_shareholders(\n kyb_response_id: \"69aeeb95febb0f1704042259\",\n vendor_data: \"company-1234\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Kyb.ListShareholdersAsync(new KYBRegistryCandidateRequest\n{\n KybResponseId = \"69aeeb95febb0f1704042259\",\n VendorData = \"company-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -45819,8 +52430,7 @@ "description": "Registry filing dates, when available. Annual returns and general meetings use last_annual_return_date and last_agm_date; they are distinct from financial accounts." }, "registry_data": { - "type": "object", - "description": "Raw record returned by the registry source, kept for reviewers. Its shape differs by country and source and is not a stable contract: read the canonical fields (`addresses`, `industries`, `ownership`, `beneficial_owners[].shareholding`) instead." + "$ref": "#/components/schemas/KYBRegistryData" }, "user_provided_data": { "type": "object", @@ -45874,6 +52484,55 @@ "type": "string", "nullable": true, "description": "The registry tier the workflow ordered: `basic`, `shareholders` or `ubo`. Also in `ownership.tier_requested`." + }, + "registry_monitoring": { + "type": "object", + "nullable": true, + "description": "The latest registry monitor for the company, or `null` when none exists.", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "status": { + "type": "string" + }, + "unavailable_reason": { + "type": "string", + "nullable": true + }, + "enrolled_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "cancelled_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "last_bill_date": { + "type": "string", + "format": "date", + "nullable": true + }, + "next_bill_date": { + "type": "string", + "format": "date", + "nullable": true + }, + "last_event_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "events_count": { + "type": "integer" + }, + "watched_fields": { + "description": "The company fields the monitor watches." + } + } } } }, @@ -45969,24 +52628,7 @@ "next_account": "26 February 2026", "due_by_date": "26 August 2026" }, - "registry_data": { - "name": "Tesco PLC", - "registration_number": "00445790", - "status": "active", - "type": "Public Limited Company", - "incorporation_date": "1947-11-27", - "tax_number": "GB412 8925 93", - "country_code": "GB", - "fetch_status": "resolved", - "industries_detail": [ - { - "code": "47110", - "name": "Retail Sale In Non-specialised Stores With Food, Beverages Or Tobacco Predominating", - "description": null, - "meta_detail": [] - } - ] - }, + "registry_data": {}, "user_provided_data": null, "confirmed_by_user_at": null, "last_console_edit_at": null, @@ -46027,7 +52669,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any screening or provider call happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any screening or provider call happens.", "content": { "application/json": { "examples": { @@ -46157,13 +52799,17 @@ } ], "parameters": [], - "description": "Retrieve the Lite profile, the direct shareholders **and the ultimate beneficial owners** resolved through the ownership chain (`registry_data.ubo_resolution` carries the corporate parent chain) of one candidate returned by `POST /v3/kyb/search/`.\n\n**Pairing with search.** Pass the candidate's `kyb_response_id` exactly as returned by a search of the same application. The search runs on the Lite registry chain; when the country's ownership data lives at another registry Didit re-finds the company there by registration number, at no extra cost.\n\n**Billing.** Billed at the country's UBO price - see [KYB registry pricing](/getting-started/kyb-registry-pricing). The tier delivered is the highest the country and the registry can serve: Shareholders when the resolved report names no natural person as a beneficial owner, Lite when there is no ownership record at all; `registry_tier_delivered` names what was billed. The balance is checked against the UBO price before any registry call (`403` when short).\n\n**Availability.** v3 only. Every call creates a business session (its id is the `request_id`).\n\n**Pending reports.** When a report is still being prepared, or the ownership section has not been retrieved from the registry yet, the endpoint returns 202 Accepted, kyb_registry.fetch_status=pending, kyb_registry.registry_ownership_status=pending, and registry_tier_delivered=null. Keep request_id and retrieve GET /v3/session/{request_id}/decision/ until registry_checks[0].company.fetch_status is resolved. Didit completes the report automatically and charges the delivered tier once it is ready. Do not repeat the purchase while it is pending; every new POST creates a separate request.", + "description": "Retrieve the Lite profile, the direct shareholders **and the ultimate beneficial owners** resolved through the ownership chain (`registry_data.ubo_resolution` carries the corporate parent chain) of one candidate returned by `POST /v3/kyb/search/`.\n\n**Pairing with search.** Pass the candidate's `kyb_response_id` exactly as returned by a search of the same application. Search at the tier you intend to buy (`tier` on `POST /v3/kyb/search/`), because the search runs on the registry chain that serves that tier and an empty Lite search is not proof that the registry does not hold the company. When the country's ownership data lives at another registry, Didit re-finds the company there by registration number, at no extra cost.\n\n**Billing.** Billed at the country's UBO price - see [KYB registry pricing](/getting-started/kyb-registry-pricing). The tier delivered is the highest the country and the registry can serve: Shareholders when the resolved report names no natural person as a beneficial owner, Lite when there is no ownership record at all; `registry_tier_delivered` names what was billed. The balance is checked against the UBO price before any registry call (`403` when short).\n\n**Availability.** v3 only. Every call creates a business session (its id is the `request_id`).\n\n**Pending reports.** When a report is still being prepared, or the ownership section has not been retrieved from the registry yet, the endpoint returns 202 Accepted, kyb_registry.fetch_status=pending, kyb_registry.registry_ownership_status=pending, and registry_tier_delivered=null. Keep request_id and retrieve GET /v3/session/{request_id}/decision/ until registry_checks[0].company.fetch_status is resolved. Didit completes the report automatically and charges the delivered tier once it is ready. Do not repeat the purchase while it is pending; every new POST creates a separate request.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KYBRegistryCandidateRequest" + }, + "example": { + "kyb_response_id": "69aeeb95febb0f1704042259", + "vendor_data": "company-1234" } } } @@ -46177,12 +52823,37 @@ { "lang": "python", "label": "Python", - "source": "import os, time, requests\n\nsearch = requests.post(\n \"https://verification.didit.me/v3/kyb/search/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n json={\"country_code\": \"GB\", \"name\": \"Tesco\"},\n timeout=60,\n).json()\nkyb_response_id = search[\"kyb_registry\"][\"companies\"][0][\"kyb_response_id\"]\n\nresp = requests.post(\n \"https://verification.didit.me/v3/kyb/ubo/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n json={\"kyb_response_id\": kyb_response_id, \"vendor_data\": \"company-1234\"},\n timeout=90,\n)\nresp.raise_for_status()\ndata = resp.json()\nrequest_id = data[\"request_id\"]\nprint(\"Keep this request ID:\", request_id)\ncompany = data[\"kyb_registry\"]\nif resp.status_code == 202 or company.get(\"fetch_status\") == \"pending\":\n # This client wait limit does not cancel the report or create a new purchase.\n deadline = time.monotonic() + 300\n while company.get(\"fetch_status\") != \"resolved\" and time.monotonic() < deadline:\n time.sleep(5)\n decision = requests.get(\n f\"https://verification.didit.me/v3/session/{request_id}/decision/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"]},\n timeout=30,\n )\n decision.raise_for_status()\n checks = decision.json().get(\"registry_checks\") or []\n if checks:\n company = checks[0].get(\"company\") or company\nif company.get(\"fetch_status\") == \"resolved\":\n print(company[\"company_name\"], company[\"registry_tier_delivered\"])\nelse:\n print(\"Still processing; retrieve this request later:\", request_id)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.kyb.list_ubos(\n kyb_response_id=\"69aeeb95febb0f1704042259\",\n vendor_data=\"company-1234\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/kyb/ubo/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n kyb_response_id: '69aeeb95febb0f1704042259',\n vendor_data: 'company-1234',\n }),\n});\nif (!res.ok) throw new Error(`Request failed: ${res.status}`);\nconst data = await res.json();\nconst requestId = data.request_id;\nconsole.log('Keep this request ID:', requestId);\nlet company = data.kyb_registry;\nif (res.status === 202 || company.fetch_status === 'pending') {\n // This client wait limit does not cancel the report or create a new purchase.\n const deadline = Date.now() + 300000;\n while (company.fetch_status !== 'resolved' && Date.now() < deadline) {\n await new Promise(resolve => setTimeout(resolve, 5000));\n const decisionResponse = await fetch(\n `https://verification.didit.me/v3/session/${requestId}/decision/`,\n { headers: { 'x-api-key': 'YOUR_API_KEY' }, signal: AbortSignal.timeout(30000) },\n );\n if (!decisionResponse.ok) throw new Error(`Retrieval failed: ${decisionResponse.status}`);\n const decision = await decisionResponse.json();\n company = decision.registry_checks?.[0]?.company ?? company;\n }\n}\nif (company.fetch_status === 'resolved') {\n console.log(company.company_name, company.registry_tier_delivered);\n} else {\n console.log('Still processing; retrieve this request later:', requestId);\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.kyb.listUbos({\n kyb_response_id: \"69aeeb95febb0f1704042259\",\n vendor_data: \"company-1234\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.KYB.ListUBOs(ctx, didit.KYBRegistryCandidateRequest{\n\tKYBResponseID: \"69aeeb95febb0f1704042259\",\n\tVendorData: didit.String(\"company-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.KYBRegistryCandidateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.kyb().listUbos(KYBRegistryCandidateRequest.builder()\n .kybResponseId(\"69aeeb95febb0f1704042259\")\n .vendorData(\"company-1234\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "kyb->listUbos([\n 'kyb_response_id' => '69aeeb95febb0f1704042259',\n 'vendor_data' => 'company-1234',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.kyb.list_ubos(\n kyb_response_id: \"69aeeb95febb0f1704042259\",\n vendor_data: \"company-1234\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Kyb.ListUbosAsync(new KYBRegistryCandidateRequest\n{\n KybResponseId = \"69aeeb95febb0f1704042259\",\n VendorData = \"company-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -46693,8 +53364,7 @@ "description": "Registry filing dates, when available. Annual returns and general meetings use last_annual_return_date and last_agm_date; they are distinct from financial accounts." }, "registry_data": { - "type": "object", - "description": "Raw record returned by the registry source, kept for reviewers. Its shape differs by country and source and is not a stable contract: read the canonical fields (`addresses`, `industries`, `ownership`, `beneficial_owners[].shareholding`) instead." + "$ref": "#/components/schemas/KYBRegistryData" }, "user_provided_data": { "type": "object", @@ -46748,6 +53418,55 @@ "type": "string", "nullable": true, "description": "The registry tier the workflow ordered: `basic`, `shareholders` or `ubo`. Also in `ownership.tier_requested`." + }, + "registry_monitoring": { + "type": "object", + "nullable": true, + "description": "The latest registry monitor for the company, or `null` when none exists.", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "status": { + "type": "string" + }, + "unavailable_reason": { + "type": "string", + "nullable": true + }, + "enrolled_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "cancelled_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "last_bill_date": { + "type": "string", + "format": "date", + "nullable": true + }, + "next_bill_date": { + "type": "string", + "format": "date", + "nullable": true + }, + "last_event_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "events_count": { + "type": "integer" + }, + "watched_fields": { + "description": "The company fields the monitor watches." + } + } } } }, @@ -46844,22 +53563,11 @@ "due_by_date": "26 August 2026" }, "registry_data": { - "name": "Tesco PLC", - "registration_number": "00445790", - "status": "active", - "type": "Public Limited Company", - "incorporation_date": "1947-11-27", - "tax_number": "GB412 8925 93", - "country_code": "GB", - "fetch_status": "resolved", - "industries_detail": [ - { - "code": "47110", - "name": "Retail Sale In Non-specialised Stores With Food, Beverages Or Tobacco Predominating", - "description": null, - "meta_detail": [] - } - ] + "ubo_resolution": { + "parent_chain": [], + "subsidiaries": [], + "unresolved": [] + } }, "user_provided_data": null, "confirmed_by_user_at": null, @@ -46901,7 +53609,7 @@ } }, "403": { - "description": "Permission denied. Returned when the `x-api-key` header is missing, malformed, revoked, or belongs to another environment — and also when the calling organization's balance cannot cover the call. Authentication failures return `403` with `{\"detail\": ...}`; this API never returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any screening or provider call happens.", + "description": "Permission denied. Returned when the `x-api-key` header is missing, and also when the calling organization's balance cannot cover the call; a wrong, revoked or expired key returns `401`. A missing key returns `403` with `{\"detail\": ...}`; a wrong, revoked or expired key returns `401`. Credit shortfalls return `403` with `{\"error\": ...}` before any screening or provider call happens.", "content": { "application/json": { "examples": { @@ -47053,7 +53761,7 @@ } } }, - "description": "Missing or invalid credentials (x-api-key or Authorization: Bearer)." + "description": "Missing credentials (x-api-key or Authorization: Bearer)." } }, "x-codeSamples": [ @@ -47065,7 +53773,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"]\n}\n\nresponse = requests.get(\n \"https://verification.didit.me/v3/id-verification/wallets/\",\n headers=headers,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.list()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.list();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.List(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().list();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->list();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.list\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.ListAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -47155,7 +53893,7 @@ } } }, - "description": "Missing or invalid credentials (x-api-key or Authorization: Bearer)." + "description": "Missing credentials (x-api-key or Authorization: Bearer)." }, "404": { "content": { @@ -47177,7 +53915,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"]\n}\n\nresponse = requests.get(\n \"https://verification.didit.me/v3/id-verification/wallets/verifications/REQUEST_ID/\",\n headers=headers,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.retrieve_verification(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.retrieveVerification(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.RetrieveVerification(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().retrieveVerification(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->retrieveVerification('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.retrieve_verification(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.RetrieveVerificationAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -47268,7 +54036,7 @@ } } }, - "description": "Missing or invalid credentials (x-api-key or Authorization: Bearer)." + "description": "Missing credentials (x-api-key or Authorization: Bearer)." }, "404": { "content": { @@ -47300,7 +54068,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"]\n}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/verifications/REQUEST_ID/poll/\",\n headers=headers,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.poll_verification(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.pollVerification(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.PollVerification(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().pollVerification(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->pollVerification('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.poll_verification(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.PollVerificationAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -47387,7 +54185,7 @@ } } }, - "description": "Missing or invalid credentials (x-api-key or Authorization: Bearer)." + "description": "Missing credentials (x-api-key or Authorization: Bearer)." }, "404": { "content": { @@ -47419,7 +54217,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"]\n}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/verifications/REQUEST_ID/cancel/\",\n headers=headers,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.cancel_verification(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.cancelVerification(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.CancelVerification(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().cancelVerification(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->cancelVerification('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.cancel_verification(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.CancelVerificationAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ] } @@ -47545,7 +54373,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -47587,7 +54415,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'DNK',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/mitid/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_mitid(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"DNK\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startMitid({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"DNK\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartMitid(ctx, didit.IDWalletsStartMitidParams{\n\tBody: didit.DigitalIDWalletAPIMitidWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIMitidWalletVerificationStartCountryEnum(\"DNK\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiMitidWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiMitidWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startMitid(DigitalIdWalletApiMitidWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiMitidWalletVerificationStartCountryEnum.of(\"DNK\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startMitid([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'DNK',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_mitid(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"DNK\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartMitidAsync(new DigitalIdWalletApiMitidWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiMitidWalletVerificationStartCountryEnum(\"DNK\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "mitid" @@ -47714,7 +54572,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -47756,7 +54614,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'SWE',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/bankid-se/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_bankid_se(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"SWE\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startBankidSe({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"SWE\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartBankidSe(ctx, didit.IDWalletsStartBankidSeParams{\n\tBody: didit.DigitalIDWalletAPIBankidSeWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPICountryEe9enum(\"SWE\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiBankidSeWalletVerificationStartRequest;\nimport me.didit.types.DigitalIdWalletApiCountryEe9Enum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startBankidSe(DigitalIdWalletApiBankidSeWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiCountryEe9Enum.of(\"SWE\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startBankidSe([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'SWE',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_bankid_se(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"SWE\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartBankidSeAsync(new DigitalIdWalletApiBankidSeWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiCountryEe9Enum(\"SWE\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "bankid_se" @@ -47883,7 +54771,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -47925,7 +54813,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'NOR',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/bankid-no/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_bankid_no(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"NOR\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startBankidNo({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"NOR\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartBankidNo(ctx, didit.IDWalletsStartBankidNoParams{\n\tBody: didit.DigitalIDWalletAPIBankidNoWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPICountryAfcEnum(\"NOR\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiBankidNoWalletVerificationStartRequest;\nimport me.didit.types.DigitalIdWalletApiCountryAfcEnum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startBankidNo(DigitalIdWalletApiBankidNoWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiCountryAfcEnum.of(\"NOR\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startBankidNo([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'NOR',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_bankid_no(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"NOR\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartBankidNoAsync(new DigitalIdWalletApiBankidNoWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiCountryAfcEnum(\"NOR\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "bankid_no" @@ -48052,7 +54970,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -48094,7 +55012,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'NOR',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/vipps/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_vipps(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"NOR\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startVipps({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"NOR\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartVipps(ctx, didit.IDWalletsStartVippsParams{\n\tBody: didit.DigitalIDWalletAPIVippsWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPICountryAfcEnum(\"NOR\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiCountryAfcEnum;\nimport me.didit.types.DigitalIdWalletApiVippsWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startVipps(DigitalIdWalletApiVippsWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiCountryAfcEnum.of(\"NOR\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startVipps([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'NOR',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_vipps(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"NOR\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartVippsAsync(new DigitalIdWalletApiVippsWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiCountryAfcEnum(\"NOR\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "vipps" @@ -48221,7 +55169,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -48263,7 +55211,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'NOR',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/buypass/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_buypass(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"NOR\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startBuypass({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"NOR\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartBuypass(ctx, didit.IDWalletsStartBuypassParams{\n\tBody: didit.DigitalIDWalletAPIBuypassWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPICountryAfcEnum(\"NOR\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiBuypassWalletVerificationStartRequest;\nimport me.didit.types.DigitalIdWalletApiCountryAfcEnum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startBuypass(DigitalIdWalletApiBuypassWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiCountryAfcEnum.of(\"NOR\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startBuypass([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'NOR',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_buypass(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"NOR\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartBuypassAsync(new DigitalIdWalletApiBuypassWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiCountryAfcEnum(\"NOR\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "buypass" @@ -48390,7 +55368,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -48432,7 +55410,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'BEL',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/itsme/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_itsme(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"BEL\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startItsme({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"BEL\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartItsme(ctx, didit.IDWalletsStartItsmeParams{\n\tBody: didit.DigitalIDWalletAPIItsmeWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.DigitalIDWalletAPIItsmeWalletVerificationStartCountryEnum(\"BEL\"),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiItsmeWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiItsmeWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startItsme(DigitalIdWalletApiItsmeWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiItsmeWalletVerificationStartCountryEnum.of(\"BEL\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startItsme([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'BEL',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_itsme(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"BEL\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartItsmeAsync(new DigitalIdWalletApiItsmeWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = \"BEL\",\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "itsme" @@ -48559,7 +55567,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -48601,7 +55609,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'NLD',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/idin/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_idin(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"NLD\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startIdin({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"NLD\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartIdin(ctx, didit.IDWalletsStartIdinParams{\n\tBody: didit.DigitalIDWalletAPIIdinWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIIdinWalletVerificationStartCountryEnum(\"NLD\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiIdinWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiIdinWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startIdin(DigitalIdWalletApiIdinWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiIdinWalletVerificationStartCountryEnum.of(\"NLD\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startIdin([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'NLD',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_idin(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"NLD\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartIdinAsync(new DigitalIdWalletApiIdinWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiIdinWalletVerificationStartCountryEnum(\"NLD\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "idin" @@ -48728,7 +55766,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -48770,7 +55808,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'FIN',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/ftn/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_ftn(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"FIN\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startFtn({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"FIN\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartFtn(ctx, didit.IDWalletsStartFtnParams{\n\tBody: didit.DigitalIDWalletAPIFtnWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIFtnWalletVerificationStartCountryEnum(\"FIN\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiFtnWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiFtnWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startFtn(DigitalIdWalletApiFtnWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiFtnWalletVerificationStartCountryEnum.of(\"FIN\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startFtn([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'FIN',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_ftn(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"FIN\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartFtnAsync(new DigitalIdWalletApiFtnWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiFtnWalletVerificationStartCountryEnum(\"FIN\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "ftn" @@ -48897,7 +55965,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -48939,7 +56007,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'DEU',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/personalausweis/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_personalausweis(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"DEU\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startPersonalausweis({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"DEU\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartPersonalausweis(ctx, didit.IDWalletsStartPersonalausweisParams{\n\tBody: didit.DigitalIDWalletAPIPersonalausweisWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIPersonalausweisWalletVerificationStartCountryEnum(\"DEU\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiPersonalausweisWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiPersonalausweisWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startPersonalausweis(DigitalIdWalletApiPersonalausweisWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiPersonalausweisWalletVerificationStartCountryEnum.of(\"DEU\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startPersonalausweis([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'DEU',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_personalausweis(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"DEU\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartPersonalausweisAsync(new DigitalIdWalletApiPersonalausweisWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiPersonalausweisWalletVerificationStartCountryEnum(\"DEU\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "personalausweis" @@ -49066,7 +56164,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -49108,7 +56206,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'SWE',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/frejaid/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_frejaid(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"SWE\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startFrejaid({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"SWE\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartFrejaid(ctx, didit.IDWalletsStartFrejaidParams{\n\tBody: didit.DigitalIDWalletAPIFrejaidWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPICountryEe9enum(\"SWE\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiCountryEe9Enum;\nimport me.didit.types.DigitalIdWalletApiFrejaidWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startFrejaid(DigitalIdWalletApiFrejaidWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiCountryEe9Enum.of(\"SWE\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startFrejaid([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'SWE',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_frejaid(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"SWE\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartFrejaidAsync(new DigitalIdWalletApiFrejaidWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiCountryEe9Enum(\"SWE\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "frejaid" @@ -49235,7 +56363,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -49277,7 +56405,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'ARE',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/uae-pass/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_uae_pass(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"ARE\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startUaePass({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"ARE\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartUaePass(ctx, didit.IDWalletsStartUaePassParams{\n\tBody: didit.DigitalIDWalletAPIUaePassWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIUaePassWalletVerificationStartCountryEnum(\"ARE\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiUaePassWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startUaePass(DigitalIdWalletApiUaePassWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum.of(\"ARE\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startUaePass([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'ARE',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_uae_pass(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"ARE\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartUaePassAsync(new DigitalIdWalletApiUaePassWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum(\"ARE\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "uae_pass" @@ -49404,7 +56562,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -49446,7 +56604,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'BRA',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/govbr/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_govbr(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"BRA\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startGovbr({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"BRA\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartGovbr(ctx, didit.IDWalletsStartGovbrParams{\n\tBody: didit.DigitalIDWalletAPIGovbrWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIGovbrWalletVerificationStartCountryEnum(\"BRA\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiGovbrWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startGovbr(DigitalIdWalletApiGovbrWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum.of(\"BRA\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startGovbr([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'BRA',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_govbr(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"BRA\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartGovbrAsync(new DigitalIdWalletApiGovbrWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum(\"BRA\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "govbr" @@ -49573,7 +56761,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -49615,7 +56803,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'GBR',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/oneid/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_oneid(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"GBR\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startOneid({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"GBR\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartOneid(ctx, didit.IDWalletsStartOneidParams{\n\tBody: didit.DigitalIDWalletAPIOneidWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPICountry520enum(\"GBR\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiCountry520Enum;\nimport me.didit.types.DigitalIdWalletApiOneidWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startOneid(DigitalIdWalletApiOneidWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiCountry520Enum.of(\"GBR\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startOneid([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'GBR',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_oneid(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"GBR\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartOneidAsync(new DigitalIdWalletApiOneidWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiCountry520Enum(\"GBR\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "oneid" @@ -49742,7 +56960,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -49784,7 +57002,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'GBR',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/govuk-wallet/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_govuk_wallet(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"GBR\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startGovukWallet({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"GBR\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartGovukWallet(ctx, didit.IDWalletsStartGovukWalletParams{\n\tBody: didit.DigitalIDWalletAPIGovukWalletWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPICountry520enum(\"GBR\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiCountry520Enum;\nimport me.didit.types.DigitalIdWalletApiGovukWalletWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startGovukWallet(DigitalIdWalletApiGovukWalletWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiCountry520Enum.of(\"GBR\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startGovukWallet([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'GBR',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_govuk_wallet(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"GBR\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartGovukWalletAsync(new DigitalIdWalletApiGovukWalletWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiCountry520Enum(\"GBR\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "govuk_wallet" @@ -49912,7 +57160,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -49954,7 +57202,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'EST',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'personal_code': '00000000000'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/smart-id/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_smart_id(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"EST\",\n personal_code=\"00000000000\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startSmartId({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"EST\",\n personal_code: \"00000000000\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartSmartID(ctx, didit.IDWalletsStartSmartIDParams{\n\tBody: didit.DigitalIDWalletAPISmartIDWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.DigitalIDWalletAPISmartIDWalletVerificationStartCountryEnum(\"EST\"),\n\t\tPersonalCode: \"00000000000\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiSmartIdWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiSmartIdWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startSmartId(DigitalIdWalletApiSmartIdWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiSmartIdWalletVerificationStartCountryEnum.of(\"EST\"))\n .personalCode(\"00000000000\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startSmartId([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'EST',\n 'personal_code' => '00000000000',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_smart_id(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"EST\",\n personal_code: \"00000000000\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartSmartIdAsync(new DigitalIdWalletApiSmartIdWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = \"EST\",\n PersonalCode = \"00000000000\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "smart_id" @@ -50083,7 +57361,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -50125,7 +57403,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'EST',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'personal_code': '00000000000',\n 'phone_number': '+37200000000'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/mobile-id/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_mobile_id(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"EST\",\n personal_code=\"00000000000\",\n phone_number=\"+37200000000\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startMobileId({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"EST\",\n personal_code: \"00000000000\",\n phone_number: \"+37200000000\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartMobileID(ctx, didit.IDWalletsStartMobileIDParams{\n\tBody: didit.DigitalIDWalletAPIMobileIDWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.DigitalIDWalletAPIMobileIDWalletVerificationStartCountryEnum(\"EST\"),\n\t\tPersonalCode: \"00000000000\",\n\t\tPhoneNumber: \"+37200000000\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiMobileIdWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiMobileIdWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startMobileId(DigitalIdWalletApiMobileIdWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiMobileIdWalletVerificationStartCountryEnum.of(\"EST\"))\n .personalCode(\"00000000000\")\n .phoneNumber(\"+37200000000\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startMobileId([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'EST',\n 'personal_code' => '00000000000',\n 'phone_number' => '+37200000000',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_mobile_id(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"EST\",\n personal_code: \"00000000000\",\n phone_number: \"+37200000000\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartMobileIdAsync(new DigitalIdWalletApiMobileIdWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = \"EST\",\n PersonalCode = \"00000000000\",\n PhoneNumber = \"+37200000000\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "mobile_id" @@ -50252,7 +57560,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -50294,7 +57602,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'EST',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/idcard-ee/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_idcard_ee(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"EST\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startIdcardEe({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"EST\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartIdcardEe(ctx, didit.IDWalletsStartIdcardEeParams{\n\tBody: didit.DigitalIDWalletAPIIdcardEeWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIIdcardEeWalletVerificationStartCountryEnum(\"EST\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiIdcardEeWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiIdcardEeWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startIdcardEe(DigitalIdWalletApiIdcardEeWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiIdcardEeWalletVerificationStartCountryEnum.of(\"EST\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startIdcardEe([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'EST',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_idcard_ee(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"EST\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartIdcardEeAsync(new DigitalIdWalletApiIdcardEeWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiIdcardEeWalletVerificationStartCountryEnum(\"EST\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "idcard_ee" @@ -50421,7 +57759,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -50463,7 +57801,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'LVA',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/eparaksts-mobile/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_eparaksts_mobile(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"LVA\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startEparakstsMobile({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"LVA\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartEparakstsMobile(ctx, didit.IDWalletsStartEparakstsMobileParams{\n\tBody: didit.DigitalIDWalletAPIEparakstsMobileWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIEparakstsMobileWalletVerificationStartCountryEnum(\"LVA\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiEparakstsMobileWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiEparakstsMobileWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startEparakstsMobile(DigitalIdWalletApiEparakstsMobileWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiEparakstsMobileWalletVerificationStartCountryEnum.of(\"LVA\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startEparakstsMobile([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'LVA',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_eparaksts_mobile(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"LVA\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartEparakstsMobileAsync(new DigitalIdWalletApiEparakstsMobileWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiEparakstsMobileWalletVerificationStartCountryEnum(\"LVA\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "eparaksts_mobile" @@ -50590,7 +57958,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -50632,7 +58000,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'CZE',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/bankid-cz/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_bankid_cz(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"CZE\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startBankidCz({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"CZE\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartBankidCz(ctx, didit.IDWalletsStartBankidCzParams{\n\tBody: didit.DigitalIDWalletAPIBankidCzWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPICountryE2dEnum(\"CZE\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiBankidCzWalletVerificationStartRequest;\nimport me.didit.types.DigitalIdWalletApiCountryE2dEnum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startBankidCz(DigitalIdWalletApiBankidCzWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiCountryE2dEnum.of(\"CZE\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startBankidCz([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'CZE',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_bankid_cz(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"CZE\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartBankidCzAsync(new DigitalIdWalletApiBankidCzWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiCountryE2dEnum(\"CZE\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "bankid_cz" @@ -50759,7 +58157,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -50801,7 +58199,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'CZE',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/mojeid/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_mojeid(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"CZE\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startMojeid({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"CZE\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartMojeid(ctx, didit.IDWalletsStartMojeidParams{\n\tBody: didit.DigitalIDWalletAPIMojeidWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPICountryE2dEnum(\"CZE\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiCountryE2dEnum;\nimport me.didit.types.DigitalIdWalletApiMojeidWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startMojeid(DigitalIdWalletApiMojeidWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiCountryE2dEnum.of(\"CZE\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startMojeid([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'CZE',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_mojeid(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"CZE\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartMojeidAsync(new DigitalIdWalletApiMojeidWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiCountryE2dEnum(\"CZE\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "mojeid" @@ -50928,7 +58356,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -50970,7 +58398,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'UKR',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/diia/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_diia(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"UKR\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startDiia({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"UKR\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartDiia(ctx, didit.IDWalletsStartDiiaParams{\n\tBody: didit.DigitalIDWalletAPIDiiaWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIDiiaWalletVerificationStartCountryEnum(\"UKR\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiDiiaWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startDiia(DigitalIdWalletApiDiiaWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum.of(\"UKR\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startDiia([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'UKR',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_diia(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"UKR\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartDiiaAsync(new DigitalIdWalletApiDiiaWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum(\"UKR\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "diia" @@ -51097,7 +58555,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -51139,7 +58597,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'FRA',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/franceconnect/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_franceconnect(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"FRA\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startFranceconnect({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"FRA\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartFranceconnect(ctx, didit.IDWalletsStartFranceconnectParams{\n\tBody: didit.DigitalIDWalletAPIFranceconnectWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIFranceconnectWalletVerificationStartCountryEnum(\"FRA\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiFranceconnectWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiFranceconnectWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startFranceconnect(DigitalIdWalletApiFranceconnectWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiFranceconnectWalletVerificationStartCountryEnum.of(\"FRA\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startFranceconnect([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'FRA',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_franceconnect(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"FRA\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartFranceconnectAsync(new DigitalIdWalletApiFranceconnectWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiFranceconnectWalletVerificationStartCountryEnum(\"FRA\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "franceconnect" @@ -51266,7 +58754,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -51308,7 +58796,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'ISL',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/audkenni/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_audkenni(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"ISL\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startAudkenni({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"ISL\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartAudkenni(ctx, didit.IDWalletsStartAudkenniParams{\n\tBody: didit.DigitalIDWalletAPIAudkenniWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIAudkenniWalletVerificationStartCountryEnum(\"ISL\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiAudkenniWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiAudkenniWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startAudkenni(DigitalIdWalletApiAudkenniWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiAudkenniWalletVerificationStartCountryEnum.of(\"ISL\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startAudkenni([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'ISL',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_audkenni(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"ISL\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartAudkenniAsync(new DigitalIdWalletApiAudkenniWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiAudkenniWalletVerificationStartCountryEnum(\"ISL\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "audkenni" @@ -51435,7 +58953,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -51477,7 +58995,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'AUS',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/connectid/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_connectid(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"AUS\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startConnectid({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"AUS\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartConnectid(ctx, didit.IDWalletsStartConnectidParams{\n\tBody: didit.DigitalIDWalletAPIConnectidWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.Some(didit.DigitalIDWalletAPIConnectidWalletVerificationStartCountryEnum(\"AUS\")),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiConnectidWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiConnectidWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startConnectid(DigitalIdWalletApiConnectidWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiConnectidWalletVerificationStartCountryEnum.of(\"AUS\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startConnectid([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'AUS',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_connectid(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"AUS\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartConnectidAsync(new DigitalIdWalletApiConnectidWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = new DigitalIdWalletApiConnectidWalletVerificationStartCountryEnum(\"AUS\"),\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "connectid" @@ -51604,7 +59152,7 @@ } } }, - "description": "Missing or invalid credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." }, "409": { "content": { @@ -51646,7 +59194,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nimport requests\n\nheaders = {\n \"x-api-key\": os.environ[\"DIDIT_API_KEY\"],\n \"Idempotency-Key\": \"your-unique-attempt-key\"\n}\npayload = {'country': 'AUT',\n 'vendor_data': 'your-customer-reference',\n 'metadata': {'reference': 'example'},\n 'return_url': 'https://app.example.com/identity/complete'}\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/id-verification/wallets/eudi/\",\n headers=headers,\n json=payload,\n timeout=30,\n)\nresponse.raise_for_status()\nprint(response.json())\n" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_eudi(\n vendor_data=\"your-customer-reference\",\n metadata={\"reference\": \"example\"},\n country=\"AUT\",\n return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startEudi({\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"AUT\",\n return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartEudi(ctx, didit.IDWalletsStartEudiParams{\n\tBody: didit.DigitalIDWalletAPIEudiWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata: didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry: didit.DigitalIDWalletAPIEudiWalletVerificationStartCountryEnum(\"AUT\"),\n\t\tReturnURL: \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiEudiWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiEudiWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startEudi(DigitalIdWalletApiEudiWalletVerificationStartRequest.builder()\n .vendorData(\"your-customer-reference\")\n .metadata(Map.of(\"reference\", \"example\"))\n .country(DigitalIdWalletApiEudiWalletVerificationStartCountryEnum.of(\"AUT\"))\n .returnUrl(\"https://app.example.com/identity/complete\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "idWallets->startEudi([\n 'vendor_data' => 'your-customer-reference',\n 'metadata' => ['reference' => 'example'],\n 'country' => 'AUT',\n 'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_eudi(\n vendor_data: \"your-customer-reference\",\n metadata: { reference: \"example\" },\n country: \"AUT\",\n return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartEudiAsync(new DigitalIdWalletApiEudiWalletVerificationStartRequest\n{\n VendorData = \"your-customer-reference\",\n Metadata = new Dictionary { [\"reference\"] = \"example\" },\n Country = \"AUT\",\n ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-wallet-id": "eudi" @@ -51751,6 +59329,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.teams.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.teams.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.Teams.ListAutoPaging(ctx, didit.CasesTeamsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().teams().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->teams->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.teams.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.Teams.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } ] }, "post": { @@ -51813,6 +59428,15 @@ "application/json": { "schema": { "$ref": "#/components/schemas/CaseReviewTeamCreate" + }, + "example": { + "name": "AML analysts", + "members": [ + { + "user_id": "9a000000-0000-4000-8000-0000000000aa", + "capacity": 10 + } + ] } } } @@ -51821,6 +59445,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.teams.create(\n name=\"AML analysts\",\n members=[{\n \"user_id\": \"9a000000-0000-4000-8000-0000000000aa\",\n \"capacity\": 10,\n }],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.teams.create({\n name: \"AML analysts\",\n members: [{\n user_id: \"9a000000-0000-4000-8000-0000000000aa\",\n capacity: 10,\n }],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Teams.Create(ctx, didit.CaseReviewTeamCreate{\n\tName: \"AML analysts\",\n\tMembers: []didit.CaseReviewTeamMemberParam{{\n\t\tUserID: \"9a000000-0000-4000-8000-0000000000aa\",\n\t\tCapacity: didit.Int(10),\n\t}},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CaseReviewTeamCreate;\nimport me.didit.types.CaseReviewTeamMember;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().teams().create(CaseReviewTeamCreate.builder()\n .name(\"AML analysts\")\n .members(List.of(CaseReviewTeamMember.builder()\n .userId(\"9a000000-0000-4000-8000-0000000000aa\")\n .capacity(10L)\n .build()))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->teams->create([\n 'name' => 'AML analysts',\n 'members' => [[\n 'user_id' => '9a000000-0000-4000-8000-0000000000aa',\n 'capacity' => 10,\n ]],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.teams.create(\n name: \"AML analysts\",\n members: [{\n user_id: \"9a000000-0000-4000-8000-0000000000aa\",\n capacity: 10,\n }]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Teams.CreateAsync(new CaseReviewTeamCreate\n{\n Name = \"AML analysts\",\n Members = new CaseReviewTeamMember[]\n {\n new()\n {\n UserId = \"9a000000-0000-4000-8000-0000000000aa\",\n Capacity = 10,\n },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -51888,6 +59549,43 @@ ], "tags": [ "Fraud Check" + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.fraud_checks.retrieve(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.fraudChecks.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FraudChecks.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.fraudChecks().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "fraudChecks->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.fraud_checks.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.FraudChecks.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -51982,6 +59680,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.requests.list(\n \"11111111-2222-3333-4444-555555555555\",\n):\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.requests.list(\"11111111-2222-3333-4444-555555555555\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.Requests.ListAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasesRequestsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().requests().list(\"11111111-2222-3333-4444-555555555555\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->requests->list('11111111-2222-3333-4444-555555555555') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.requests.list(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.Requests.ListAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } ] }, "post": { @@ -52074,7 +59809,44 @@ "ApiKeyAuth": [] } ], - "description": "Confirm the exact signed preview within 15 minutes. Only fixed templates and an OTP-verified contact belonging to the case subject are accepted. The request ID makes retries idempotent. Delivery is queued; SENT, SIMULATED and UNKNOWN are distinct outcomes. An actionable request sets the case to Awaiting user. A review update leaves its status unchanged." + "description": "Confirm the exact signed preview within 15 minutes. Only fixed templates and an OTP-verified contact belonging to the case subject are accepted. The request ID makes retries idempotent. Delivery is queued; SENT, SIMULATED and UNKNOWN are distinct outcomes. An actionable request sets the case to Awaiting user. A review update leaves its status unchanged.", + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.requests.create(\n \"11111111-2222-3333-4444-555555555555\",\n contact_id=\"11111111-2222-3333-4444-555555555555\",\n purpose=\"identity_document\",\n request_id=\"11111111-2222-3333-4444-555555555555\",\n expires_at=\"2026-01-15T10:00:00Z\",\n preview_token=\"your-preview-token\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requests.create(\"11111111-2222-3333-4444-555555555555\", {\n contact_id: \"11111111-2222-3333-4444-555555555555\",\n purpose: \"identity_document\",\n request_id: \"11111111-2222-3333-4444-555555555555\",\n expires_at: \"2026-01-15T10:00:00Z\",\n preview_token: \"your-preview-token\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Requests.Create(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CustomerMessagingCaseRequestConfirmRequest{\n\tContactID: \"11111111-2222-3333-4444-555555555555\",\n\tPurpose: didit.CustomerMessagingPurposeEnum(\"identity_document\"),\n\tRequestID: \"11111111-2222-3333-4444-555555555555\",\n\tExpiresAt: time.Date(2026, 1, 15, 10, 0, 0, 0, time.UTC),\n\tPreviewToken: \"your-preview-token\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.OffsetDateTime;\nimport me.didit.Didit;\nimport me.didit.types.CustomerMessagingCaseRequestConfirmRequest;\nimport me.didit.types.CustomerMessagingPurposeEnum;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requests().create(\"11111111-2222-3333-4444-555555555555\", CustomerMessagingCaseRequestConfirmRequest.builder()\n .contactId(\"11111111-2222-3333-4444-555555555555\")\n .purpose(CustomerMessagingPurposeEnum.of(\"identity_document\"))\n .requestId(\"11111111-2222-3333-4444-555555555555\")\n .expiresAt(OffsetDateTime.parse(\"2026-01-15T10:00:00Z\"))\n .previewToken(\"your-preview-token\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->requests->create('11111111-2222-3333-4444-555555555555', [\n 'contact_id' => '11111111-2222-3333-4444-555555555555',\n 'purpose' => 'identity_document',\n 'request_id' => '11111111-2222-3333-4444-555555555555',\n 'expires_at' => '2026-01-15T10:00:00Z',\n 'preview_token' => 'your-preview-token',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.requests.create(\n \"11111111-2222-3333-4444-555555555555\",\n contact_id: \"11111111-2222-3333-4444-555555555555\",\n purpose: \"identity_document\",\n request_id: \"11111111-2222-3333-4444-555555555555\",\n expires_at: \"2026-01-15T10:00:00Z\",\n preview_token: \"your-preview-token\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Requests.CreateAsync(\"11111111-2222-3333-4444-555555555555\", new CustomerMessagingCaseRequestConfirmRequest\n{\n ContactId = \"11111111-2222-3333-4444-555555555555\",\n Purpose = \"identity_document\",\n RequestId = \"11111111-2222-3333-4444-555555555555\",\n ExpiresAt = DateTimeOffset.Parse(\"2026-01-15T10:00:00Z\"),\n PreviewToken = \"your-preview-token\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/fraud/checks/": { @@ -52098,6 +59870,28 @@ "application/json": { "schema": { "$ref": "#/components/schemas/FraudCheckRequestRequest" + }, + "example": { + "client_reference": "review-attempt-001", + "subject": { + "identifiers": [ + { + "type": "email", + "value": "applicant@example.com" + } + ], + "attributes": { + "first_name": "Alex", + "last_name": "Example" + } + }, + "checks": { + "include": [ + "networks_same_org", + "networks_cross_org", + "email_risk" + ] + } } }, "multipart/form-data": { @@ -52196,6 +59990,43 @@ ], "tags": [ "Fraud Check" + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.fraud_checks.create(\n client_reference=\"review-attempt-001\",\n subject={\n \"identifiers\": [{\n \"type\": \"email\",\n \"value\": \"applicant@example.com\",\n }],\n \"attributes\": {\n \"first_name\": \"Alex\",\n \"last_name\": \"Example\",\n },\n },\n checks={\n \"include\": [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n },\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.fraudChecks.create({\n client_reference: \"review-attempt-001\",\n subject: {\n identifiers: [{\n type: \"email\",\n value: \"applicant@example.com\",\n }],\n attributes: {\n first_name: \"Alex\",\n last_name: \"Example\",\n },\n },\n checks: {\n include: [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FraudChecks.Create(ctx, didit.FraudCheckRequestRequest{\n\tClientReference: didit.String(\"review-attempt-001\"),\n\tSubject: didit.FraudCheckSubjectRequest{\n\t\tIdentifiers: []didit.FraudCheckIdentifierRequest{{\n\t\t\tType: didit.FraudTypeEnum(\"email\"),\n\t\t\tValue: \"applicant@example.com\",\n\t\t}},\n\t\tAttributes: didit.Some(didit.FraudCheckAttributesRequest{\n\t\t\tFirstName: didit.String(\"Alex\"),\n\t\t\tLastName: didit.String(\"Example\"),\n\t\t}),\n\t},\n\tChecks: didit.Some(didit.FraudCheckModuleSelectionRequest{\n\t\tInclude: didit.Some([]didit.FraudExcludeEnum{didit.FraudExcludeEnum(\"networks_same_org\"), didit.FraudExcludeEnum(\"networks_cross_org\"), didit.FraudExcludeEnum(\"email_risk\")}),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.FraudCheckAttributesRequest;\nimport me.didit.types.FraudCheckIdentifierRequest;\nimport me.didit.types.FraudCheckModuleSelectionRequest;\nimport me.didit.types.FraudCheckRequestRequest;\nimport me.didit.types.FraudCheckSubjectRequest;\nimport me.didit.types.FraudExcludeEnum;\nimport me.didit.types.FraudTypeEnum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.fraudChecks().create(FraudCheckRequestRequest.builder()\n .clientReference(\"review-attempt-001\")\n .subject(FraudCheckSubjectRequest.builder()\n .identifiers(List.of(FraudCheckIdentifierRequest.builder()\n .type(FraudTypeEnum.of(\"email\"))\n .value(\"applicant@example.com\")\n .build()))\n .attributes(FraudCheckAttributesRequest.builder()\n .firstName(\"Alex\")\n .lastName(\"Example\")\n .build())\n .build())\n .checks(FraudCheckModuleSelectionRequest.builder()\n .include(List.of(FraudExcludeEnum.of(\"networks_same_org\"), FraudExcludeEnum.of(\"networks_cross_org\"), FraudExcludeEnum.of(\"email_risk\")))\n .build())\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "fraudChecks->create([\n 'client_reference' => 'review-attempt-001',\n 'subject' => [\n 'identifiers' => [[\n 'type' => 'email',\n 'value' => 'applicant@example.com',\n ]],\n 'attributes' => [\n 'first_name' => 'Alex',\n 'last_name' => 'Example',\n ],\n ],\n 'checks' => [\n 'include' => ['networks_same_org', 'networks_cross_org', 'email_risk'],\n ],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.fraud_checks.create(\n client_reference: \"review-attempt-001\",\n subject: {\n identifiers: [{\n type: \"email\",\n value: \"applicant@example.com\",\n }],\n attributes: {\n first_name: \"Alex\",\n last_name: \"Example\",\n },\n },\n checks: {\n include: [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.FraudChecks.CreateAsync(new FraudCheckRequestRequest\n{\n ClientReference = \"review-attempt-001\",\n Subject = new()\n {\n Identifiers = new FraudCheckIdentifierRequest[]\n {\n new()\n {\n Type = \"email\",\n Value = \"applicant@example.com\",\n },\n },\n Attributes = new FraudCheckAttributesRequest\n {\n FirstName = \"Alex\",\n LastName = \"Example\",\n },\n },\n Checks = new FraudCheckModuleSelectionRequest\n {\n Include = new FraudExcludeEnum[] { \"networks_same_org\", \"networks_cross_org\", \"email_risk\" },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -52278,6 +60109,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.requests.cancel(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requests.cancel(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Requests.Cancel(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requests().cancel(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->requests->cancel('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.requests.cancel(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Requests.CancelAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -52345,6 +60213,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.requests.retrieve_options(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requests.retrieveOptions(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Requests.RetrieveOptions(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requests().retrieveOptions(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->requests->retrieveOptions('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.requests.retrieve_options(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Requests.RetrieveOptionsAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -52422,6 +60327,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\ncontent = client.cases.requests.retrieve_attachment(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n)\nwith open(\"download.png\", \"wb\") as file:\n file.write(content)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst content = await didit.cases.requests.retrieveAttachment(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n);\nawait writeFile(\"download.png\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresp, err := client.Cases.Requests.RetrieveAttachment(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.png\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().requests().retrieveAttachment(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\n .writeTo(Path.of(\"download.png\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->requests->retrieveAttachment('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');\n$content->saveTo('download.png');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ncontent = didit.cases.requests.retrieve_attachment(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\"\n)\nFile.binwrite(\"download.png\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar content = await client.Cases.Requests.RetrieveAttachmentAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nawait content.SaveToAsync(\"download.png\");" + } ] } }, @@ -52513,6 +60455,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.routing_rules.list_history(\n \"11111111-2222-3333-4444-555555555555\",\n):\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.routingRules.listHistory(\"11111111-2222-3333-4444-555555555555\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.RoutingRules.ListHistoryAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasesRoutingRulesListHistoryParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().routingRules().listHistory(\"11111111-2222-3333-4444-555555555555\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->routingRules->listHistory('11111111-2222-3333-4444-555555555555') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.routing_rules.list_history(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.RoutingRules.ListHistoryAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } ] } }, @@ -52597,7 +60576,8 @@ "EMAIL", "KYB_REGISTRY", "KYB_KEY_PEOPLE", - "KYB" + "KYB", + "GEOLOCATION" ], "example": "OCR" } @@ -52664,6 +60644,7 @@ "sender_kind", "subject", "html", + "text", "language", "will_be_sent", "not_sent_reason", @@ -52723,6 +60704,11 @@ "description": "The email's HTML exactly as it is sent, with its logo embedded as a data URL. Render it in a sandboxed frame, never directly in your application DOM.", "example": "..." }, + "text": { + "type": "string", + "description": "The email's words as plain text, as the person's Messages thread keeps them, for a compact preview (the HTML stays the email the person receives).", + "example": "Almost there\n\nSome steps need to be completed again.\nHere’s what to fix:\n\nhttps://verify.didit.me/session/abc123" + }, "language": { "type": "string", "description": "The language the email is written in. English (`en`) when the `email_language` you asked for is not offered.", @@ -52786,7 +60772,8 @@ "EMAIL", "KYB_REGISTRY", "KYB_KEY_PEOPLE", - "KYB" + "KYB", + "GEOLOCATION" ], "example": "OCR" } @@ -52917,7 +60904,7 @@ } }, "403": { - "description": "Missing or invalid credentials, a caller without the `write:sessions` privilege, a scoped API key without the access this endpoint needs, or a `session_id` that belongs to another application.", + "description": "Missing credentials, a caller without the `write:sessions` privilege, a scoped API key without the access this endpoint needs, or a `session_id` that belongs to another application.", "content": { "application/json": { "examples": { @@ -52972,7 +60959,44 @@ } } } - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.preview_resubmission(\n \"11111111-2222-3333-4444-555555555555\",\n nodes_to_resubmit=[{\n \"node_id\": \"feature_poa_1\",\n \"feature\": \"POA\",\n }],\n email_language=\"en\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.previewResubmission(\"11111111-2222-3333-4444-555555555555\", {\n nodes_to_resubmit: [{\n node_id: \"feature_poa_1\",\n feature: \"POA\",\n }],\n email_language: \"en\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.PreviewResubmission(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsPreviewResubmissionParams{\n\tNodesToResubmit: didit.Some([]didit.SessionsPreviewResubmissionParamsNodesToResubmit{{\n\t\tNodeID: \"feature_poa_1\",\n\t\tFeature: \"POA\",\n\t}}),\n\tEmailLanguage: didit.String(\"en\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.SessionsPreviewResubmissionParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().previewResubmission(\"11111111-2222-3333-4444-555555555555\", SessionsPreviewResubmissionParams.builder()\n .nodesToResubmit(List.of(SessionsPreviewResubmissionParams.NodesToResubmit.builder()\n .nodeId(\"feature_poa_1\")\n .feature(SessionsPreviewResubmissionParams.NodesToResubmit.Feature.of(\"POA\"))\n .build()))\n .emailLanguage(\"en\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->previewResubmission('11111111-2222-3333-4444-555555555555', [\n 'nodes_to_resubmit' => [[\n 'node_id' => 'feature_poa_1',\n 'feature' => 'POA',\n ]],\n 'email_language' => 'en',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.preview_resubmission(\n \"11111111-2222-3333-4444-555555555555\",\n nodes_to_resubmit: [{\n node_id: \"feature_poa_1\",\n feature: \"POA\",\n }],\n email_language: \"en\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.PreviewResubmissionAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsPreviewResubmissionParams\n{\n NodesToResubmit = new SessionsPreviewResubmissionParamsNodesToResubmit[]\n {\n new()\n {\n NodeId = \"feature_poa_1\",\n Feature = \"POA\",\n },\n },\n EmailLanguage = \"en\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/organization/{organization_id}/application/{application_id}/cases/routing-rules/{record_uuid}/": { @@ -53046,6 +61070,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.retrieve(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->routingRules->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] }, "patch": { @@ -53131,6 +61192,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.update(\n \"11111111-2222-3333-4444-555555555555\",\n name=\"your-name\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.update(\"11111111-2222-3333-4444-555555555555\", {\n name: \"your-name\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CaseRoutingRuleUpdate{\n\tName: didit.String(\"your-name\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CaseRoutingRuleUpdate;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().update(\"11111111-2222-3333-4444-555555555555\", CaseRoutingRuleUpdate.builder()\n .name(\"your-name\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->routingRules->update('11111111-2222-3333-4444-555555555555', [\n 'name' => 'your-name',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.update(\n \"11111111-2222-3333-4444-555555555555\",\n name: \"your-name\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new CaseRoutingRuleUpdate\n{\n Name = \"your-name\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -53268,6 +61366,28 @@ "application/json": { "schema": { "$ref": "#/components/schemas/FraudCheckRequestRequest" + }, + "example": { + "client_reference": "review-attempt-001", + "subject": { + "identifiers": [ + { + "type": "email", + "value": "applicant@example.com" + } + ], + "attributes": { + "first_name": "Alex", + "last_name": "Example" + } + }, + "checks": { + "include": [ + "networks_same_org", + "networks_cross_org", + "email_risk" + ] + } } }, "multipart/form-data": { @@ -53307,6 +61427,43 @@ { "BearerAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.fraud_checks.plan(\n client_reference=\"review-attempt-001\",\n subject={\n \"identifiers\": [{\n \"type\": \"email\",\n \"value\": \"applicant@example.com\",\n }],\n \"attributes\": {\n \"first_name\": \"Alex\",\n \"last_name\": \"Example\",\n },\n },\n checks={\n \"include\": [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n },\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.fraudChecks.plan({\n client_reference: \"review-attempt-001\",\n subject: {\n identifiers: [{\n type: \"email\",\n value: \"applicant@example.com\",\n }],\n attributes: {\n first_name: \"Alex\",\n last_name: \"Example\",\n },\n },\n checks: {\n include: [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FraudChecks.Plan(ctx, didit.FraudCheckRequestRequest{\n\tClientReference: didit.String(\"review-attempt-001\"),\n\tSubject: didit.FraudCheckSubjectRequest{\n\t\tIdentifiers: []didit.FraudCheckIdentifierRequest{{\n\t\t\tType: didit.FraudTypeEnum(\"email\"),\n\t\t\tValue: \"applicant@example.com\",\n\t\t}},\n\t\tAttributes: didit.Some(didit.FraudCheckAttributesRequest{\n\t\t\tFirstName: didit.String(\"Alex\"),\n\t\t\tLastName: didit.String(\"Example\"),\n\t\t}),\n\t},\n\tChecks: didit.Some(didit.FraudCheckModuleSelectionRequest{\n\t\tInclude: didit.Some([]didit.FraudExcludeEnum{didit.FraudExcludeEnum(\"networks_same_org\"), didit.FraudExcludeEnum(\"networks_cross_org\"), didit.FraudExcludeEnum(\"email_risk\")}),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.FraudCheckAttributesRequest;\nimport me.didit.types.FraudCheckIdentifierRequest;\nimport me.didit.types.FraudCheckModuleSelectionRequest;\nimport me.didit.types.FraudCheckRequestRequest;\nimport me.didit.types.FraudCheckSubjectRequest;\nimport me.didit.types.FraudExcludeEnum;\nimport me.didit.types.FraudTypeEnum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.fraudChecks().plan(FraudCheckRequestRequest.builder()\n .clientReference(\"review-attempt-001\")\n .subject(FraudCheckSubjectRequest.builder()\n .identifiers(List.of(FraudCheckIdentifierRequest.builder()\n .type(FraudTypeEnum.of(\"email\"))\n .value(\"applicant@example.com\")\n .build()))\n .attributes(FraudCheckAttributesRequest.builder()\n .firstName(\"Alex\")\n .lastName(\"Example\")\n .build())\n .build())\n .checks(FraudCheckModuleSelectionRequest.builder()\n .include(List.of(FraudExcludeEnum.of(\"networks_same_org\"), FraudExcludeEnum.of(\"networks_cross_org\"), FraudExcludeEnum.of(\"email_risk\")))\n .build())\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "fraudChecks->plan([\n 'client_reference' => 'review-attempt-001',\n 'subject' => [\n 'identifiers' => [[\n 'type' => 'email',\n 'value' => 'applicant@example.com',\n ]],\n 'attributes' => [\n 'first_name' => 'Alex',\n 'last_name' => 'Example',\n ],\n ],\n 'checks' => [\n 'include' => ['networks_same_org', 'networks_cross_org', 'email_risk'],\n ],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.fraud_checks.plan(\n client_reference: \"review-attempt-001\",\n subject: {\n identifiers: [{\n type: \"email\",\n value: \"applicant@example.com\",\n }],\n attributes: {\n first_name: \"Alex\",\n last_name: \"Example\",\n },\n },\n checks: {\n include: [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.FraudChecks.PlanAsync(new FraudCheckRequestRequest\n{\n ClientReference = \"review-attempt-001\",\n Subject = new()\n {\n Identifiers = new FraudCheckIdentifierRequest[]\n {\n new()\n {\n Type = \"email\",\n Value = \"applicant@example.com\",\n },\n },\n Attributes = new FraudCheckAttributesRequest\n {\n FirstName = \"Alex\",\n LastName = \"Example\",\n },\n },\n Checks = new FraudCheckModuleSelectionRequest\n {\n Include = new FraudExcludeEnum[] { \"networks_same_org\", \"networks_cross_org\", \"email_risk\" },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -53409,6 +61566,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.routing_rules.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.routingRules.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.RoutingRules.ListAutoPaging(ctx, didit.CasesRoutingRulesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().routingRules().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->routingRules->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.routing_rules.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.RoutingRules.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } ] }, "post": { @@ -53471,6 +61665,17 @@ "application/json": { "schema": { "$ref": "#/components/schemas/CaseRoutingRuleCreate" + }, + "example": { + "name": "AML screening alerts", + "conditions": [ + { + "field": "source", + "operator": "equals", + "value": "AML_SCREENING" + } + ], + "blueprint": "b1de0000-0000-4000-8000-000000000002" } } } @@ -53479,6 +61684,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.create(\n name=\"AML screening alerts\",\n conditions=[{\n \"field\": \"source\",\n \"operator\": \"equals\",\n \"value\": \"AML_SCREENING\",\n }],\n blueprint=\"b1de0000-0000-4000-8000-000000000002\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.create({\n name: \"AML screening alerts\",\n conditions: [{\n field: \"source\",\n operator: \"equals\",\n value: \"AML_SCREENING\",\n }],\n blueprint: \"b1de0000-0000-4000-8000-000000000002\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.Create(ctx, didit.CaseRoutingRuleCreate{\n\tName: \"AML screening alerts\",\n\tConditions: []didit.CaseRoutingConditionParam{{\n\t\tField: \"source\",\n\t\tOperator: \"equals\",\n\t\tValue: \"AML_SCREENING\",\n\t}},\n\tBlueprint: \"b1de0000-0000-4000-8000-000000000002\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CaseRoutingCondition;\nimport me.didit.types.CaseRoutingRuleCreate;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().create(CaseRoutingRuleCreate.builder()\n .name(\"AML screening alerts\")\n .conditions(List.of(CaseRoutingCondition.builder()\n .field(CaseRoutingCondition.Field.of(\"source\"))\n .operator(CaseRoutingCondition.Operator.of(\"equals\"))\n .value(CaseRoutingCondition.Value.ofString(\"AML_SCREENING\"))\n .build()))\n .blueprint(\"b1de0000-0000-4000-8000-000000000002\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->routingRules->create([\n 'name' => 'AML screening alerts',\n 'conditions' => [[\n 'field' => 'source',\n 'operator' => 'equals',\n 'value' => 'AML_SCREENING',\n ]],\n 'blueprint' => 'b1de0000-0000-4000-8000-000000000002',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.create(\n name: \"AML screening alerts\",\n conditions: [{\n field: \"source\",\n operator: \"equals\",\n value: \"AML_SCREENING\",\n }],\n blueprint: \"b1de0000-0000-4000-8000-000000000002\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.CreateAsync(new CaseRoutingRuleCreate\n{\n Name = \"AML screening alerts\",\n Conditions = new CaseRoutingCondition[]\n {\n new()\n {\n Field = \"source\",\n Operator = \"equals\",\n Value = \"AML_SCREENING\",\n },\n },\n Blueprint = \"b1de0000-0000-4000-8000-000000000002\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -53566,6 +61808,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.publish(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version=0,\n expected_revision=\"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.publish(\"11111111-2222-3333-4444-555555555555\", {\n expected_version: 0,\n expected_revision: \"11111111-2222-3333-4444-555555555555\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.Publish(ctx, \"11111111-2222-3333-4444-555555555555\", didit.RoutingPublicationPolicyDraftPreconditionRequest{\n\tExpectedVersion: 0,\n\tExpectedRevision: didit.String(\"11111111-2222-3333-4444-555555555555\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.RoutingPublicationPolicyDraftPreconditionRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().publish(\"11111111-2222-3333-4444-555555555555\", RoutingPublicationPolicyDraftPreconditionRequest.builder()\n .expectedVersion(0L)\n .expectedRevision(\"11111111-2222-3333-4444-555555555555\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->routingRules->publish('11111111-2222-3333-4444-555555555555', [\n 'expected_version' => 0,\n 'expected_revision' => '11111111-2222-3333-4444-555555555555',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.publish(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version: 0,\n expected_revision: \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.PublishAsync(\"11111111-2222-3333-4444-555555555555\", new RoutingPublicationPolicyDraftPreconditionRequest\n{\n ExpectedVersion = 0,\n ExpectedRevision = \"11111111-2222-3333-4444-555555555555\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -53653,6 +61932,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.publish(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version=0,\n expected_revision=\"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.publish(\"11111111-2222-3333-4444-555555555555\", {\n expected_version: 0,\n expected_revision: \"11111111-2222-3333-4444-555555555555\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.Publish(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasePublicationPolicyDraftPreconditionRequest{\n\tExpectedVersion: 0,\n\tExpectedRevision: didit.String(\"11111111-2222-3333-4444-555555555555\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasePublicationPolicyDraftPreconditionRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().publish(\"11111111-2222-3333-4444-555555555555\", CasePublicationPolicyDraftPreconditionRequest.builder()\n .expectedVersion(0L)\n .expectedRevision(\"11111111-2222-3333-4444-555555555555\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->publish('11111111-2222-3333-4444-555555555555', [\n 'expected_version' => 0,\n 'expected_revision' => '11111111-2222-3333-4444-555555555555',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.publish(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version: 0,\n expected_revision: \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.PublishAsync(\"11111111-2222-3333-4444-555555555555\", new CasePublicationPolicyDraftPreconditionRequest\n{\n ExpectedVersion = 0,\n ExpectedRevision = \"11111111-2222-3333-4444-555555555555\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -53747,7 +62063,44 @@ "ApiKeyAuth": [] } ], - "description": "Render the production email without sending or changing the case. Returns the exact recipient, sender, subject, body and a signed preview_token. Send the same contact_id, purpose, language, request_id, expires_at and preview_token to confirm within 15 minutes." + "description": "Render the production email without sending or changing the case. Returns the exact recipient, sender, subject, body and a signed preview_token. Send the same contact_id, purpose, language, request_id, expires_at and preview_token to confirm within 15 minutes.", + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.requests.preview(\n \"11111111-2222-3333-4444-555555555555\",\n contact_id=\"11111111-2222-3333-4444-555555555555\",\n purpose=\"identity_document\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requests.preview(\"11111111-2222-3333-4444-555555555555\", {\n contact_id: \"11111111-2222-3333-4444-555555555555\",\n purpose: \"identity_document\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Requests.Preview(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CustomerMessagingCaseRequestPreviewRequest{\n\tContactID: \"11111111-2222-3333-4444-555555555555\",\n\tPurpose: didit.CustomerMessagingPurposeEnum(\"identity_document\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CustomerMessagingCaseRequestPreviewRequest;\nimport me.didit.types.CustomerMessagingPurposeEnum;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requests().preview(\"11111111-2222-3333-4444-555555555555\", CustomerMessagingCaseRequestPreviewRequest.builder()\n .contactId(\"11111111-2222-3333-4444-555555555555\")\n .purpose(CustomerMessagingPurposeEnum.of(\"identity_document\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->requests->preview('11111111-2222-3333-4444-555555555555', [\n 'contact_id' => '11111111-2222-3333-4444-555555555555',\n 'purpose' => 'identity_document',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.requests.preview(\n \"11111111-2222-3333-4444-555555555555\",\n contact_id: \"11111111-2222-3333-4444-555555555555\",\n purpose: \"identity_document\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Requests.PreviewAsync(\"11111111-2222-3333-4444-555555555555\", new CustomerMessagingCaseRequestPreviewRequest\n{\n ContactId = \"11111111-2222-3333-4444-555555555555\",\n Purpose = \"identity_document\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/action-receipts/": { @@ -53819,7 +62172,44 @@ "ApiKeyAuth": [] } ], - "description": "List subject-action receipts, newest first, with at most 20 results per page. Use next_offset for the next page. Input note text is not exposed in the history." + "description": "List subject-action receipts, newest first, with at most 20 results per page. Use next_offset for the next page. Input note text is not exposed in the history.", + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.list_action_receipts(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.listActionReceipts(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.ListActionReceipts(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasesListActionReceiptsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().listActionReceipts(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->listActionReceipts('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.list_action_receipts(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ListActionReceiptsAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/notes/{note_uuid}/": { @@ -53905,6 +62295,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\nclient = Didit()\n\nclient.networks.notes.delete(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n extra_headers={\"Authorization\": \"Bearer YOUR_CONSOLE_USER_TOKEN\"},\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nconst didit = new Didit({\n fetch: (url, init) => {\n const headers = new Headers(init?.headers);\n headers.set(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\");\n return fetch(url, { ...init, headers });\n },\n});\n\nawait didit.networks.notes.delete(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nclient := didit.NewClient()\n\nif err := client.Networks.Notes.Delete(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", didit.NetworksNotesDeleteParams{\n\tAuthorization: \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n}); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.core.RequestOptions;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nDidit client = new Didit();\n\nclient.networks().notes().delete(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", RequestOptions.builder()\n .header(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\")\n .build());" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->notes->delete('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555', [\n 'authorization' => 'Bearer YOUR_CONSOLE_USER_TOKEN',\n]);" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\ndidit = Didit::Client.new\n\ndidit.networks.notes.delete(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n request_options: { extra_headers: { \"Authorization\" => \"Bearer YOUR_CONSOLE_USER_TOKEN\" } }\n)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nusing var client = new DiditClient();\n\nawait client.Networks.Notes.DeleteAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", requestOptions: new RequestOptions\n{\n Headers = new Dictionary\n {\n [\"Authorization\"] = \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n },\n});" + } ] } }, @@ -53976,7 +62403,44 @@ "ApiKeyAuth": [] } ], - "description": "Retry only this failed subject action using its saved inputs. Current write permission is checked. Applied actions return their receipt without executing again. Case closure is independent." + "description": "Retry only this failed subject action using its saved inputs. Current write permission is checked. Applied actions return their receipt without executing again. Case closure is independent.", + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.retry_action_receipt(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.retryActionReceipt(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RetryActionReceipt(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().retryActionReceipt(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->retryActionReceipt('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.retry_action_receipt(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RetryActionReceiptAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/organization/{organization_id}/application/{application_id}/cases/blueprints/{blueprint_uuid}/draft/": { @@ -54040,6 +62504,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.retrieve_draft(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.retrieveDraft(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.RetrieveDraft(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().retrieveDraft(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->retrieveDraft('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.retrieve_draft(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.RetrieveDraftAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] }, "put": { @@ -54093,6 +62594,13 @@ "application/json": { "schema": { "$ref": "#/components/schemas/CasePublicationPolicyDraftWriteRequest" + }, + "example": { + "expected_version": 1, + "expected_revision": "4e5f0000-0000-4000-8000-000000000003", + "changes": { + "max_active_cases": 20 + } } }, "multipart/form-data": { @@ -54125,6 +62633,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.save_draft(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version=1,\n expected_revision=\"4e5f0000-0000-4000-8000-000000000003\",\n changes={\"max_active_cases\": 20},\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.saveDraft(\"11111111-2222-3333-4444-555555555555\", {\n expected_version: 1,\n expected_revision: \"4e5f0000-0000-4000-8000-000000000003\",\n changes: { max_active_cases: 20 },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.SaveDraft(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasePublicationPolicyDraftWriteRequest{\n\tExpectedVersion: 1,\n\tExpectedRevision: didit.String(\"4e5f0000-0000-4000-8000-000000000003\"),\n\tChanges: map[string]any{\"max_active_cases\": 20},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.CasePublicationPolicyDraftWriteRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().saveDraft(\"11111111-2222-3333-4444-555555555555\", CasePublicationPolicyDraftWriteRequest.builder()\n .expectedVersion(1L)\n .expectedRevision(\"4e5f0000-0000-4000-8000-000000000003\")\n .changes(Map.of(\"max_active_cases\", 20))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->saveDraft('11111111-2222-3333-4444-555555555555', [\n 'expected_version' => 1,\n 'expected_revision' => '4e5f0000-0000-4000-8000-000000000003',\n 'changes' => ['max_active_cases' => 20],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.save_draft(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version: 1,\n expected_revision: \"4e5f0000-0000-4000-8000-000000000003\",\n changes: { max_active_cases: 20 }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.SaveDraftAsync(\"11111111-2222-3333-4444-555555555555\", new CasePublicationPolicyDraftWriteRequest\n{\n ExpectedVersion = 1,\n ExpectedRevision = \"4e5f0000-0000-4000-8000-000000000003\",\n Changes = new Dictionary { [\"max_active_cases\"] = 20 },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] }, "delete": { @@ -54193,7 +62738,44 @@ } } } - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.blueprints.discard_draft(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version=0,\n expected_revision=\"11111111-2222-3333-4444-555555555555\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.blueprints.discardDraft(\"11111111-2222-3333-4444-555555555555\", {\n expected_version: 0,\n expected_revision: \"11111111-2222-3333-4444-555555555555\",\n});" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.Blueprints.DiscardDraft(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasePublicationPolicyDraftPreconditionRequest{\n\tExpectedVersion: 0,\n\tExpectedRevision: didit.String(\"11111111-2222-3333-4444-555555555555\"),\n}); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CasePublicationPolicyDraftPreconditionRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().blueprints().discardDraft(\"11111111-2222-3333-4444-555555555555\", CasePublicationPolicyDraftPreconditionRequest.builder()\n .expectedVersion(0L)\n .expectedRevision(\"11111111-2222-3333-4444-555555555555\")\n .build());" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->discardDraft('11111111-2222-3333-4444-555555555555', [\n 'expected_version' => 0,\n 'expected_revision' => '11111111-2222-3333-4444-555555555555',\n]);" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.blueprints.discard_draft(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version: 0,\n expected_revision: \"11111111-2222-3333-4444-555555555555\"\n)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.Blueprints.DiscardDraftAsync(\"11111111-2222-3333-4444-555555555555\", new CasePublicationPolicyDraftPreconditionRequest\n{\n ExpectedVersion = 0,\n ExpectedRevision = \"11111111-2222-3333-4444-555555555555\",\n});" + } + ] } }, "/v3/organization/{organization_id}/application/{application_id}/cases/teams/{record_uuid}/": { @@ -54267,6 +62849,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.teams.retrieve(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.teams.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Teams.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().teams().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->teams->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.teams.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Teams.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] }, "patch": { @@ -54349,6 +62968,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.teams.update(\n \"11111111-2222-3333-4444-555555555555\",\n name=\"your-name\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.teams.update(\"11111111-2222-3333-4444-555555555555\", {\n name: \"your-name\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Teams.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CaseReviewTeamUpdate{\n\tName: didit.String(\"your-name\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CaseReviewTeamUpdate;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().teams().update(\"11111111-2222-3333-4444-555555555555\", CaseReviewTeamUpdate.builder()\n .name(\"your-name\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->teams->update('11111111-2222-3333-4444-555555555555', [\n 'name' => 'your-name',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.teams.update(\n \"11111111-2222-3333-4444-555555555555\",\n name: \"your-name\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Teams.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new CaseReviewTeamUpdate\n{\n Name = \"your-name\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -54434,6 +63090,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\nclient = Didit()\n\ncontent = client.networks.download_report(\n \"11111111-2222-3333-4444-555555555555\",\n extra_headers={\"Authorization\": \"Bearer YOUR_CONSOLE_USER_TOKEN\"},\n)\nwith open(\"download.pdf\", \"wb\") as file:\n file.write(content)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nconst didit = new Didit({\n fetch: (url, init) => {\n const headers = new Headers(init?.headers);\n headers.set(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\");\n return fetch(url, { ...init, headers });\n },\n});\n\nconst content = await didit.networks.downloadReport(\"11111111-2222-3333-4444-555555555555\");\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nclient := didit.NewClient()\n\nresp, err := client.Networks.DownloadReport(ctx, \"11111111-2222-3333-4444-555555555555\", didit.NetworksDownloadReportParams{\n\tAuthorization: \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.core.RequestOptions;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nDidit client = new Didit();\n\nclient.networks().downloadReport(\"11111111-2222-3333-4444-555555555555\", RequestOptions.builder()\n .header(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\")\n .build())\n .writeTo(Path.of(\"download.pdf\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->downloadReport('11111111-2222-3333-4444-555555555555', [\n 'authorization' => 'Bearer YOUR_CONSOLE_USER_TOKEN',\n]);\n$content->saveTo('download.pdf');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\ndidit = Didit::Client.new\n\ncontent = didit.networks.download_report(\n \"11111111-2222-3333-4444-555555555555\",\n request_options: { extra_headers: { \"Authorization\" => \"Bearer YOUR_CONSOLE_USER_TOKEN\" } }\n)\nFile.binwrite(\"download.pdf\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nusing var client = new DiditClient();\n\nvar content = await client.Networks.DownloadReportAsync(\"11111111-2222-3333-4444-555555555555\", requestOptions: new RequestOptions\n{\n Headers = new Dictionary\n {\n [\"Authorization\"] = \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n },\n});\nawait content.SaveToAsync(\"download.pdf\");" + } ] } }, @@ -54557,6 +63250,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\nclient = Didit()\n\nfor item in client.networks.notes.list(\n \"11111111-2222-3333-4444-555555555555\",\n extra_headers={\"Authorization\": \"Bearer YOUR_CONSOLE_USER_TOKEN\"},\n):\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nconst didit = new Didit({\n fetch: (url, init) => {\n const headers = new Headers(init?.headers);\n headers.set(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\");\n return fetch(url, { ...init, headers });\n },\n});\n\nfor await (const item of didit.networks.notes.list(\"11111111-2222-3333-4444-555555555555\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nclient := didit.NewClient()\n\niter := client.Networks.Notes.ListAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.NetworksNotesListParams{\n\tAuthorization: \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.core.RequestOptions;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nDidit client = new Didit();\n\nfor (var item : client.networks().notes().list(\"11111111-2222-3333-4444-555555555555\", RequestOptions.builder()\n .header(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\")\n .build())) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->notes->list('11111111-2222-3333-4444-555555555555', [\n 'authorization' => 'Bearer YOUR_CONSOLE_USER_TOKEN',\n]) as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\ndidit = Didit::Client.new\n\ndidit.networks.notes.list(\n \"11111111-2222-3333-4444-555555555555\",\n request_options: { extra_headers: { \"Authorization\" => \"Bearer YOUR_CONSOLE_USER_TOKEN\" } }\n).auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Networks.Notes.ListAsync(\"11111111-2222-3333-4444-555555555555\", requestOptions: new RequestOptions\n{\n Headers = new Dictionary\n {\n [\"Authorization\"] = \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n },\n}))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } ] }, "post": { @@ -54680,6 +63410,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\nclient = Didit()\n\nresult = client.networks.notes.create(\n \"11111111-2222-3333-4444-555555555555\",\n comment=\"your-comment\",\n client_reference=\"11111111-2222-3333-4444-555555555555\",\n extra_headers={\"Authorization\": \"Bearer YOUR_CONSOLE_USER_TOKEN\"},\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nconst didit = new Didit({\n fetch: (url, init) => {\n const headers = new Headers(init?.headers);\n headers.set(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\");\n return fetch(url, { ...init, headers });\n },\n});\n\nconst result = await didit.networks.notes.create(\"11111111-2222-3333-4444-555555555555\", {\n comment: \"your-comment\",\n client_reference: \"11111111-2222-3333-4444-555555555555\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nclient := didit.NewClient()\n\nresult, err := client.Networks.Notes.Create(ctx, \"11111111-2222-3333-4444-555555555555\", didit.NetworksNotesCreateParams{\n\tComment: \"your-comment\",\n\tClientReference: \"11111111-2222-3333-4444-555555555555\",\n\tAuthorization: \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.core.RequestOptions;\nimport me.didit.types.NetworksNotesCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nDidit client = new Didit();\n\nvar result = client.networks().notes().create(\"11111111-2222-3333-4444-555555555555\", NetworksNotesCreateParams.builder()\n .comment(\"your-comment\")\n .clientReference(\"11111111-2222-3333-4444-555555555555\")\n .build(), RequestOptions.builder()\n .header(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->notes->create('11111111-2222-3333-4444-555555555555', [\n 'comment' => 'your-comment',\n 'client_reference' => '11111111-2222-3333-4444-555555555555',\n 'authorization' => 'Bearer YOUR_CONSOLE_USER_TOKEN',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\ndidit = Didit::Client.new\n\nresult = didit.networks.notes.create(\n \"11111111-2222-3333-4444-555555555555\",\n comment: \"your-comment\",\n client_reference: \"11111111-2222-3333-4444-555555555555\",\n request_options: { extra_headers: { \"Authorization\" => \"Bearer YOUR_CONSOLE_USER_TOKEN\" } }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.Notes.CreateAsync(\"11111111-2222-3333-4444-555555555555\", new NetworksNotesCreateParams\n{\n Comment = \"your-comment\",\n ClientReference = \"11111111-2222-3333-4444-555555555555\",\n}, requestOptions: new RequestOptions\n{\n Headers = new Dictionary\n {\n [\"Authorization\"] = \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -54744,6 +63511,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.retrieve_draft(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.retrieveDraft(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.RetrieveDraft(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().retrieveDraft(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->routingRules->retrieveDraft('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.retrieve_draft(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.RetrieveDraftAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] }, "put": { @@ -54797,6 +63601,13 @@ "application/json": { "schema": { "$ref": "#/components/schemas/RoutingPublicationPolicyDraftWriteRequest" + }, + "example": { + "expected_version": 1, + "expected_revision": "4e5f0000-0000-4000-8000-000000000003", + "changes": { + "priority": 10 + } } }, "multipart/form-data": { @@ -54829,6 +63640,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.save_draft(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version=1,\n expected_revision=\"4e5f0000-0000-4000-8000-000000000003\",\n changes={\"priority\": 10},\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.saveDraft(\"11111111-2222-3333-4444-555555555555\", {\n expected_version: 1,\n expected_revision: \"4e5f0000-0000-4000-8000-000000000003\",\n changes: { priority: 10 },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.SaveDraft(ctx, \"11111111-2222-3333-4444-555555555555\", didit.RoutingPublicationPolicyDraftWriteRequest{\n\tExpectedVersion: 1,\n\tExpectedRevision: didit.String(\"4e5f0000-0000-4000-8000-000000000003\"),\n\tChanges: map[string]any{\"priority\": 10},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.RoutingPublicationPolicyDraftWriteRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().saveDraft(\"11111111-2222-3333-4444-555555555555\", RoutingPublicationPolicyDraftWriteRequest.builder()\n .expectedVersion(1L)\n .expectedRevision(\"4e5f0000-0000-4000-8000-000000000003\")\n .changes(Map.of(\"priority\", 10))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->routingRules->saveDraft('11111111-2222-3333-4444-555555555555', [\n 'expected_version' => 1,\n 'expected_revision' => '4e5f0000-0000-4000-8000-000000000003',\n 'changes' => ['priority' => 10],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.save_draft(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version: 1,\n expected_revision: \"4e5f0000-0000-4000-8000-000000000003\",\n changes: { priority: 10 }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.SaveDraftAsync(\"11111111-2222-3333-4444-555555555555\", new RoutingPublicationPolicyDraftWriteRequest\n{\n ExpectedVersion = 1,\n ExpectedRevision = \"4e5f0000-0000-4000-8000-000000000003\",\n Changes = new Dictionary { [\"priority\"] = 10 },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] }, "delete": { @@ -54897,7 +63745,44 @@ } } } - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.routing_rules.discard_draft(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version=0,\n expected_revision=\"11111111-2222-3333-4444-555555555555\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.routingRules.discardDraft(\"11111111-2222-3333-4444-555555555555\", {\n expected_version: 0,\n expected_revision: \"11111111-2222-3333-4444-555555555555\",\n});" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.RoutingRules.DiscardDraft(ctx, \"11111111-2222-3333-4444-555555555555\", didit.RoutingPublicationPolicyDraftPreconditionRequest{\n\tExpectedVersion: 0,\n\tExpectedRevision: didit.String(\"11111111-2222-3333-4444-555555555555\"),\n}); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.RoutingPublicationPolicyDraftPreconditionRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().routingRules().discardDraft(\"11111111-2222-3333-4444-555555555555\", RoutingPublicationPolicyDraftPreconditionRequest.builder()\n .expectedVersion(0L)\n .expectedRevision(\"11111111-2222-3333-4444-555555555555\")\n .build());" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->routingRules->discardDraft('11111111-2222-3333-4444-555555555555', [\n 'expected_version' => 0,\n 'expected_revision' => '11111111-2222-3333-4444-555555555555',\n]);" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.routing_rules.discard_draft(\n \"11111111-2222-3333-4444-555555555555\",\n expected_version: 0,\n expected_revision: \"11111111-2222-3333-4444-555555555555\"\n)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.RoutingRules.DiscardDraftAsync(\"11111111-2222-3333-4444-555555555555\", new RoutingPublicationPolicyDraftPreconditionRequest\n{\n ExpectedVersion = 0,\n ExpectedRevision = \"11111111-2222-3333-4444-555555555555\",\n});" + } + ] } }, "/v3/organization/{organization_id}/application/{application_id}/cases/duplicates/": { @@ -54943,6 +63828,12 @@ "application/json": { "schema": { "$ref": "#/components/schemas/CaseDuplicateCaseDuplicateQueryRequest" + }, + "example": { + "subject": { + "type": "user", + "uuid": "5b9a0000-0000-4000-8000-00000000f00d" + } } }, "multipart/form-data": { @@ -54969,7 +63860,44 @@ "ApiKeyAuth": [] } ], - "description": "Review existing cases for a subject or owned source record before manual case creation. Both open and resolved investigations are returned. Each page contains at most 20 cases; use next_offset to request another page." + "description": "Review existing cases for a subject or owned source record before manual case creation. Both open and resolved investigations are returned. Each page contains at most 20 cases; use next_offset to request another page.", + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.find_duplicates(\n subject={\n \"type\": \"user\",\n \"uuid\": \"5b9a0000-0000-4000-8000-00000000f00d\",\n },\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.findDuplicates({\n subject: {\n type: \"user\",\n uuid: \"5b9a0000-0000-4000-8000-00000000f00d\",\n },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.FindDuplicates(ctx, didit.CaseDuplicateCaseDuplicateQueryRequest{\n\tSubject: didit.Some(didit.CaseDuplicateCaseSubjectInputRequest{\n\t\tType: didit.CaseDuplicateTypeEnum(\"user\"),\n\t\tUUID: \"5b9a0000-0000-4000-8000-00000000f00d\",\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CaseDuplicateCaseDuplicateQueryRequest;\nimport me.didit.types.CaseDuplicateCaseSubjectInputRequest;\nimport me.didit.types.CaseDuplicateTypeEnum;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().findDuplicates(CaseDuplicateCaseDuplicateQueryRequest.builder()\n .subject(CaseDuplicateCaseSubjectInputRequest.builder()\n .type(CaseDuplicateTypeEnum.of(\"user\"))\n .uuid(\"5b9a0000-0000-4000-8000-00000000f00d\")\n .build())\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->findDuplicates([\n 'subject' => [\n 'type' => 'user',\n 'uuid' => '5b9a0000-0000-4000-8000-00000000f00d',\n ],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.find_duplicates(\n subject: {\n type: \"user\",\n uuid: \"5b9a0000-0000-4000-8000-00000000f00d\",\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.FindDuplicatesAsync(new CaseDuplicateCaseDuplicateQueryRequest\n{\n Subject = new CaseDuplicateCaseSubjectInputRequest\n {\n Type = \"user\",\n Uuid = \"5b9a0000-0000-4000-8000-00000000f00d\",\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/organization/{organization_id}/application/{application_id}/cases/routing-rules/preview/": { @@ -55041,6 +63969,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.preview(\n source=\"MANUAL\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.preview({\n source: \"MANUAL\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.Preview(ctx, didit.CaseRoutingPreviewRequest{\n\tSource: \"MANUAL\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.CaseRoutingPreviewRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().preview(CaseRoutingPreviewRequest.builder()\n .source(CaseRoutingPreviewRequest.Source.of(\"MANUAL\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->routingRules->preview([\n 'source' => 'MANUAL',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.preview(source: \"MANUAL\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.PreviewAsync(new CaseRoutingPreviewRequest\n{\n Source = \"MANUAL\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -55127,6 +64092,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.list_reviewers()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.listReviewers();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.ListReviewers(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().listReviewers();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->listReviewers();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.list_reviewers\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ListReviewersAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -55218,13 +64220,50 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.blueprints.list_history(\n \"11111111-2222-3333-4444-555555555555\",\n):\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.blueprints.listHistory(\"11111111-2222-3333-4444-555555555555\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.Blueprints.ListHistoryAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasesBlueprintsListHistoryParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().blueprints().listHistory(\"11111111-2222-3333-4444-555555555555\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->blueprints->listHistory('11111111-2222-3333-4444-555555555555') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.blueprints.list_history(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.Blueprints.ListHistoryAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } ] } }, "/v3/session/{sessionId}/signatures/{nodeId}/documents/{documentId}/file/": { "get": { "summary": "Download a signed document", - "description": "Download the signed PDF of one document of an Electronic Signature step. Use the `signed_file` path of `signatures[].documents[]` in the decision. The PDF holds the document the signer was shown with their field values stamped, the evidence page (unless `signature_evidence_page` is off) and the PAdES signature with its timestamp. Didit checks the file against `sha256_signed` before returning it.\n\nWorks for User Verification (KYC) and Business Verification (KYB) sessions. Needs `read:sessions`; your API key works. See the [Electronic Signature report](/core-technology/electronic-signature/report-electronic-signature#download-the-signed-documents).", + "description": "Download the signed PDF of one document of an E-signature step. Use the `signed_file` path of `signatures[].documents[]` in the decision. The PDF holds the document the signer was shown with their field values stamped and the evidence page (unless `signature_evidence_page` is off). An Advanced (AES) PDF also carries the PAdES signature with its timestamp; a Simple PDF has no digital signature, seal or timestamp. Didit checks the file against `sha256_signed` before returning it.\n\nWorks for User Verification (KYC) and Business Verification (KYB) sessions. Needs `read:sessions`; your API key works. See the [E-signature report](/core-technology/electronic-signature/report-electronic-signature#download-the-signed-documents).", "operationId": "get_v3_session_signature_document_file", "x-didit-sdk": { "resource": "sessions.signatures", @@ -55251,7 +64290,7 @@ "name": "nodeId", "in": "path", "required": true, - "description": "The Electronic Signature step: `node_id` of the item in `signatures[]`.", + "description": "The E-signature step: `node_id` of the item in `signatures[]`.", "schema": { "type": "string", "example": "feature_signature" @@ -55295,7 +64334,7 @@ } }, "403": { - "description": "Missing or invalid credentials, or a credential that can't read this session. Didit's API-key authentication answers `403`, never `401`.", + "description": "Missing credentials, or a credential that can't read this session. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "schema": { @@ -55373,13 +64412,50 @@ } } } - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.signatures.download_document(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n \"11111111-2222-3333-4444-555555555555\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n file.write(content)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.signatures.downloadDocument(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n \"11111111-2222-3333-4444-555555555555\",\n);\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.Signatures.DownloadDocument(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().signatures().downloadDocument(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\")\n .writeTo(Path.of(\"download.pdf\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->signatures->downloadDocument('11111111-2222-3333-4444-555555555555', 'feature_signature', '11111111-2222-3333-4444-555555555555');\n$content->saveTo('download.pdf');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.signatures.download_document(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n \"11111111-2222-3333-4444-555555555555\"\n)\nFile.binwrite(\"download.pdf\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.Signatures.DownloadDocumentAsync(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\");\nawait content.SaveToAsync(\"download.pdf\");" + } + ] } }, "/v3/session/{sessionId}/signatures/{nodeId}/evidence/": { "get": { "summary": "Download the signature evidence", - "description": "Download a signer's evidence PDF: the level and format, the signer and their verified identity session, the code confirmation, the IP address, each document with its original SHA-256 and field values, the certificate, the timestamp and the SHA-256 of every signed file. Use the `evidence_file` path of the signer's item in `signatures[]`.\n\nAlways pass `signature_id` when a Business Verification step has several signers: without it, the route picks one of the step's signers. Needs `read:sessions`; your API key works.", + "description": "Download a signer's evidence PDF: the level and format, the signer, the IP address, each document with its original SHA-256 and field values and the SHA-256 of every signed file, plus, for an Advanced (AES) signature, the verified identity session, the code confirmation, the certificate and the timestamp. Use the `evidence_file` path of the signer's item in `signatures[]`.\n\nAlways pass `signature_id` when a Business Verification step has several signers: without it, the route picks one of the step's signers. Needs `read:sessions`; your API key works.", "operationId": "get_v3_session_signature_evidence", "x-didit-sdk": { "resource": "sessions.signatures", @@ -55406,7 +64482,7 @@ "name": "nodeId", "in": "path", "required": true, - "description": "The Electronic Signature step: `node_id` of the item in `signatures[]`.", + "description": "The E-signature step: `node_id` of the item in `signatures[]`.", "schema": { "type": "string", "example": "feature_signature" @@ -55450,7 +64526,7 @@ } }, "403": { - "description": "Missing or invalid credentials, or a credential that can't read this session. Didit's API-key authentication answers `403`, never `401`.", + "description": "Missing credentials, or a credential that can't read this session. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "schema": { @@ -55528,7 +64604,44 @@ } } } - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.signatures.download_evidence(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n file.write(content)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.signatures.downloadEvidence(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n);\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.Signatures.DownloadEvidence(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_signature\", didit.SessionsSignaturesDownloadEvidenceParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().signatures().downloadEvidence(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\")\n .writeTo(Path.of(\"download.pdf\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->signatures->downloadEvidence('11111111-2222-3333-4444-555555555555', 'feature_signature');\n$content->saveTo('download.pdf');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.signatures.download_evidence(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\"\n)\nFile.binwrite(\"download.pdf\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.Signatures.DownloadEvidenceAsync(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\");\nawait content.SaveToAsync(\"download.pdf\");" + } + ] } }, "/v3/session/{sessionId}/signatures/{nodeId}/fields/{fieldId}/image/": { @@ -55561,7 +64674,7 @@ "name": "nodeId", "in": "path", "required": true, - "description": "The Electronic Signature step: `node_id` of the item in `signatures[]`.", + "description": "The E-signature step: `node_id` of the item in `signatures[]`.", "schema": { "type": "string", "example": "feature_signature" @@ -55618,7 +64731,7 @@ } }, "403": { - "description": "Missing or invalid credentials, or a credential that can't read this session. Didit's API-key authentication answers `403`, never `401`.", + "description": "Missing credentials, or a credential that can't read this session. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "schema": { @@ -55662,13 +64775,50 @@ } } } - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.signatures.download_field_image(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n \"11111111-2222-3333-4444-555555555555\",\n)\nwith open(\"download.png\", \"wb\") as file:\n file.write(content)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.signatures.downloadFieldImage(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n \"11111111-2222-3333-4444-555555555555\",\n);\nawait writeFile(\"download.png\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.Signatures.DownloadFieldImage(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.png\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().signatures().downloadFieldImage(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\")\n .writeTo(Path.of(\"download.png\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->signatures->downloadFieldImage('11111111-2222-3333-4444-555555555555', 'feature_signature', '11111111-2222-3333-4444-555555555555');\n$content->saveTo('download.png');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.signatures.download_field_image(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n \"11111111-2222-3333-4444-555555555555\"\n)\nFile.binwrite(\"download.png\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.Signatures.DownloadFieldImageAsync(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\");\nawait content.SaveToAsync(\"download.png\");" + } + ] } }, "/v3/session/{sessionId}/signatures/{nodeId}/validate/": { "post": { "summary": "Validate signatures again", - "description": "Re-check the signed documents of an Electronic Signature step. Didit re-reads every signed PDF, checks its SHA-256 and validates the PAdES signature, the certificate, the revocation data and the timestamp, then saves the result in each signer's `validation` and returns the updated items. Nothing is signed again. Send `signature_id` to check one signer; without it, every signer of the step is checked, and the call fails if any of them hasn't signed.\n\nNeeds `write:sessions`; your API key works. In the console it's the **Validate again** button.", + "description": "Re-check the signed documents of an E-signature step. Didit re-reads every signed PDF, checks its SHA-256 and, for an Advanced (AES) signature, validates the PAdES signature, the certificate, the revocation data and the timestamp (a Simple signature has no digital signature, so only the file integrity is checked), then saves the result in each signer's `validation` and returns the updated items. Nothing is signed again. Send `signature_id` to check one signer; without it, every signer of the step is checked, and the call fails if any of them hasn't signed.\n\nNeeds `write:sessions`; your API key works. In the console it's the **Validate again** button.", "operationId": "post_v3_session_signature_validate", "x-didit-sdk": { "resource": "sessions.signatures", @@ -55695,7 +64845,7 @@ "name": "nodeId", "in": "path", "required": true, - "description": "The Electronic Signature step: `node_id` of the item in `signatures[]`.", + "description": "The E-signature step: `node_id` of the item in `signatures[]`.", "schema": { "type": "string", "example": "feature_signature" @@ -55774,7 +64924,7 @@ } }, "403": { - "description": "Missing or invalid credentials, or a credential that can't read this session. Didit's API-key authentication answers `403`, never `401`.", + "description": "Missing credentials, or a credential that can't read this session. A missing key returns `403`; a wrong, revoked or expired key returns `401`.", "content": { "application/json": { "schema": { @@ -55845,7 +64995,44 @@ } } } - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.signatures.validate(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n signature_id=\"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.signatures.validate(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n {\n signature_id: \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\",\n },\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Signatures.Validate(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_signature\", didit.SessionsSignaturesValidateParams{\n\tSignatureID: didit.String(\"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsSignaturesValidateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().signatures().validate(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", SessionsSignaturesValidateParams.builder()\n .signatureId(\"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->signatures->validate('11111111-2222-3333-4444-555555555555', 'feature_signature', [\n 'signature_id' => '0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.signatures.validate(\n \"11111111-2222-3333-4444-555555555555\",\n \"feature_signature\",\n signature_id: \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Signatures.ValidateAsync(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", new SessionsSignaturesValidateParams\n{\n SignatureId = \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/document-ai/{sessionId}/documents/{documentUuid}/": { @@ -55932,12 +65119,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nsession_id = '11111111-2222-3333-4444-555555555555'\ndocument_uuid = '44444444-5555-6666-7777-888888888888'\nresp = requests.patch(\n f'https://verification.didit.me/v3/document-ai/{session_id}/documents/{document_uuid}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={'extracted_data': {'invoice_number': 'INV-2026-0042'}, 'status': 'Approved'},\n timeout=10,\n)\nresp.raise_for_status()\ndocument = resp.json()\nprint(document['status'], document['extracted_data'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_document_ai_data(\n \"11111111-2222-3333-4444-555555555555\",\n \"44444444-5555-6666-7777-888888888888\",\n extracted_data={\"invoice_number\": \"INV-2026-0042\"},\n status=\"Approved\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const sessionId = '11111111-2222-3333-4444-555555555555';\nconst documentUuid = '44444444-5555-6666-7777-888888888888';\nconst resp = await fetch(`https://verification.didit.me/v3/document-ai/${sessionId}/documents/${documentUuid}/`, {\n method: 'PATCH',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ extracted_data: { invoice_number: 'INV-2026-0042' }, status: 'Approved' }),\n});\nif (!resp.ok) throw new Error(`Update failed: ${resp.status}`);\nconst document = await resp.json();\nconsole.log(document.status, document.extracted_data);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateDocumentAiData(\n \"11111111-2222-3333-4444-555555555555\",\n \"44444444-5555-6666-7777-888888888888\",\n {\n extracted_data: { invoice_number: \"INV-2026-0042\" },\n status: \"Approved\",\n },\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateDocumentAiData(ctx, \"11111111-2222-3333-4444-555555555555\", \"44444444-5555-6666-7777-888888888888\", didit.SessionsUpdateDocumentAiDataParams{\n\tExtractedData: didit.Some(map[string]any{\"invoice_number\": \"INV-2026-0042\"}),\n\tStatus: didit.Some(didit.SessionsUpdateDocumentAiDataParamsStatus(\"Approved\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsUpdateDocumentAiDataParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateDocumentAiData(\"11111111-2222-3333-4444-555555555555\", \"44444444-5555-6666-7777-888888888888\", SessionsUpdateDocumentAiDataParams.builder()\n .extractedData(Map.of(\"invoice_number\", \"INV-2026-0042\"))\n .status(SessionsUpdateDocumentAiDataParams.Status.of(\"Approved\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->updateDocumentAiData('11111111-2222-3333-4444-555555555555', '44444444-5555-6666-7777-888888888888', [\n 'extracted_data' => ['invoice_number' => 'INV-2026-0042'],\n 'status' => 'Approved',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_document_ai_data(\n \"11111111-2222-3333-4444-555555555555\",\n \"44444444-5555-6666-7777-888888888888\",\n extracted_data: { invoice_number: \"INV-2026-0042\" },\n status: \"Approved\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateDocumentAiDataAsync(\"11111111-2222-3333-4444-555555555555\", \"44444444-5555-6666-7777-888888888888\", new SessionsUpdateDocumentAiDataParams\n{\n ExtractedData = new Dictionary { [\"invoice_number\"] = \"INV-2026-0042\" },\n Status = new SessionsUpdateDocumentAiDataParamsStatus(\"Approved\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -56059,7 +65271,7 @@ } }, "403": { - "description": "Authentication or authorization failure. Missing, invalid and revoked keys return `403` (not `401`); so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist. Distinguish them by `detail`.", + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", "content": { "application/json": { "schema": { @@ -56202,12 +65414,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/aml/dataset-freshness/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nbody = resp.json()\nif body['availability'] == 'available':\n for family, info in body['dataset_freshness']['sources'].items():\n print(family, info['last_updated_at'], info['oldest_updated_at'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.aml.retrieve_dataset_freshness()\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/aml/dataset-freshness/', {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Freshness lookup failed: ${resp.status}`);\nconst body = await resp.json();\nif (body.availability === 'available') {\n for (const [family, info] of Object.entries(body.dataset_freshness.sources)) {\n console.log(family, info.last_updated_at, info.oldest_updated_at);\n }\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.aml.retrieveDatasetFreshness();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AML.RetrieveDatasetFreshness(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.aml().retrieveDatasetFreshness();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "aml->retrieveDatasetFreshness();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.aml.retrieve_dataset_freshness\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Aml.RetrieveDatasetFreshnessAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -56300,7 +65537,7 @@ } }, "403": { - "description": "The request is not allowed. A missing or invalid API key gets the generic message (never `401`).", + "description": "The request is not allowed. A missing key gets the generic message; a wrong, revoked or expired key gets `401`.", "content": { "application/json": { "schema": { @@ -56493,12 +65730,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/lists/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'list_type': 'blocklist'},\n timeout=10,\n)\nresp.raise_for_status()\nfor item in resp.json()['results']:\n print(item['uuid'], item['entry_type'], item['name'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.lists.list():\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/lists/?list_type=blocklist', {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst page = await resp.json();\nconsole.log(page.results.map((list) => [list.uuid, list.entry_type, list.name]));" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.lists.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Lists.ListAutoPaging(ctx, didit.ListsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.lists().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "lists->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.lists.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Lists.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -56621,7 +65883,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: read` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: read` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -56753,12 +66015,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/lists/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={\n 'name': 'Trusted office IPs',\n 'description': 'Office egress ranges',\n 'list_type': 'allowlist',\n 'entry_type': 'ip_address',\n },\n timeout=10,\n)\nresp.raise_for_status()\nprint('Created list', resp.json()['uuid'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.lists.create(\n name=\"Trusted office IPs\",\n description=\"Office egress ranges\",\n list_type=\"allowlist\",\n entry_type=\"ip_address\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/lists/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: 'Trusted office IPs',\n description: 'Office egress ranges',\n list_type: 'allowlist',\n entry_type: 'ip_address',\n }),\n});\nif (!resp.ok) throw new Error(`Create failed: ${resp.status}`);\nconst list = await resp.json();\nconsole.log('Created list', list.uuid);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.lists.create({\n name: \"Trusted office IPs\",\n description: \"Office egress ranges\",\n list_type: \"allowlist\",\n entry_type: \"ip_address\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Lists.Create(ctx, didit.ListsCreateParams{\n\tName: \"Trusted office IPs\",\n\tDescription: didit.String(\"Office egress ranges\"),\n\tListType: \"allowlist\",\n\tEntryType: \"ip_address\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.ListsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.lists().create(ListsCreateParams.builder()\n .name(\"Trusted office IPs\")\n .description(\"Office egress ranges\")\n .listType(ListsCreateParams.ListType.of(\"allowlist\"))\n .entryType(ListsCreateParams.EntryType.of(\"ip_address\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "lists->create([\n 'name' => 'Trusted office IPs',\n 'description' => 'Office egress ranges',\n 'list_type' => 'allowlist',\n 'entry_type' => 'ip_address',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.lists.create(\n name: \"Trusted office IPs\",\n description: \"Office egress ranges\",\n list_type: \"allowlist\",\n entry_type: \"ip_address\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Lists.CreateAsync(new ListsCreateParams\n{\n Name = \"Trusted office IPs\",\n Description = \"Office egress ranges\",\n ListType = \"allowlist\",\n EntryType = \"ip_address\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -56853,7 +66140,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -56918,12 +66205,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nlist_uuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.get(\n f'https://verification.didit.me/v3/lists/{list_uuid}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json())" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.lists.retrieve(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const listUuid = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/lists/${listUuid}/`, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Lookup failed: ${resp.status}`);\nconst list = await resp.json();\nconsole.log(list.name, list.entry_count);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.lists.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Lists.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.lists().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "lists->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.lists.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Lists.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -56968,7 +66280,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: read` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: read` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -57091,12 +66403,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nlist_uuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.patch(\n f'https://verification.didit.me/v3/lists/{list_uuid}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={'name': 'Trusted office and VPN IPs'},\n timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json())" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.lists.update(\n \"11111111-2222-3333-4444-555555555555\",\n name=\"Trusted office and VPN IPs\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const listUuid = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/lists/${listUuid}/`, {\n method: 'PATCH',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ name: 'Trusted office and VPN IPs' }),\n});\nif (!resp.ok) throw new Error(`Update failed: ${resp.status}`);\nconsole.log(await resp.json());" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.lists.update(\"11111111-2222-3333-4444-555555555555\", {\n name: \"Trusted office and VPN IPs\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Lists.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.ListsUpdateParams{\n\tName: didit.String(\"Trusted office and VPN IPs\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.ListsUpdateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.lists().update(\"11111111-2222-3333-4444-555555555555\", ListsUpdateParams.builder()\n .name(\"Trusted office and VPN IPs\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "lists->update('11111111-2222-3333-4444-555555555555', [\n 'name' => 'Trusted office and VPN IPs',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.lists.update(\n \"11111111-2222-3333-4444-555555555555\",\n name: \"Trusted office and VPN IPs\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Lists.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new ListsUpdateParams\n{\n Name = \"Trusted office and VPN IPs\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -57177,7 +66514,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -57254,12 +66591,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nlist_uuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.delete(\n f'https://verification.didit.me/v3/lists/{list_uuid}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nprint('Deleted:', resp.status_code == 204)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.lists.delete(\n \"11111111-2222-3333-4444-555555555555\",\n)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const listUuid = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/lists/${listUuid}/`, {\n method: 'DELETE',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (resp.status !== 204) throw new Error(`Delete failed: ${resp.status}`);\nconsole.log('List deleted');" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.lists.delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Lists.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.lists().delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "lists->delete('11111111-2222-3333-4444-555555555555');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.lists.delete(\"11111111-2222-3333-4444-555555555555\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Lists.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");" } ], "responses": { @@ -57295,7 +66657,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -57417,12 +66779,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nlist_uuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.get(\n f'https://verification.didit.me/v3/lists/{list_uuid}/entries/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'search': 'example.com', 'limit': 100},\n timeout=10,\n)\nresp.raise_for_status()\nfor entry in resp.json()['results']:\n print(entry['uuid'], entry['value'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.lists.entries.list(\n \"11111111-2222-3333-4444-555555555555\",\n):\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const listUuid = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(\n `https://verification.didit.me/v3/lists/${listUuid}/entries/?search=example.com`,\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n);\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst page = await resp.json();\nconsole.log(page.count, page.results.map((entry) => entry.value));" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.lists.entries.list(\"11111111-2222-3333-4444-555555555555\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Lists.Entries.ListAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.ListsEntriesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.lists().entries().list(\"11111111-2222-3333-4444-555555555555\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "lists->entries->list('11111111-2222-3333-4444-555555555555') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.lists.entries.list(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Lists.Entries.ListAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -57546,7 +66933,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: read` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: read` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -57742,12 +67129,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nlist_uuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.post(\n f'https://verification.didit.me/v3/lists/{list_uuid}/entries/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={'reference_session_id': '33333333-4444-5555-6666-777777777777'},\n timeout=10,\n)\nresp.raise_for_status()\nentry = resp.json()\nprint('Listed', entry['value'], 'as', entry['uuid'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.lists.entries.create(\n \"11111111-2222-3333-4444-555555555555\",\n value=\"+14155552671\",\n comment=\"Reported fraud\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const listUuid = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/lists/${listUuid}/entries/`, {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ value: '+14155552671', comment: 'Reported fraud' }),\n});\nif (!resp.ok) throw new Error(`Create failed: ${resp.status} ${await resp.text()}`);\nconst entry = await resp.json();\nconsole.log('Listed', entry.value, 'as', entry.uuid);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.lists.entries.create(\"11111111-2222-3333-4444-555555555555\", {\n value: \"+14155552671\",\n comment: \"Reported fraud\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Lists.Entries.Create(ctx, \"11111111-2222-3333-4444-555555555555\", didit.ListsEntriesCreateParams{\n\tValue: didit.String(\"+14155552671\"),\n\tComment: didit.String(\"Reported fraud\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.ListsEntriesCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.lists().entries().create(\"11111111-2222-3333-4444-555555555555\", ListsEntriesCreateParams.builder()\n .value(\"+14155552671\")\n .comment(\"Reported fraud\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "lists->entries->create('11111111-2222-3333-4444-555555555555', [\n 'value' => '+14155552671',\n 'comment' => 'Reported fraud',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.lists.entries.create(\n \"11111111-2222-3333-4444-555555555555\",\n value: \"+14155552671\",\n comment: \"Reported fraud\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Lists.Entries.CreateAsync(\"11111111-2222-3333-4444-555555555555\", new ListsEntriesCreateParams\n{\n Value = \"+14155552671\",\n Comment = \"Reported fraud\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -57918,7 +67330,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -58022,12 +67434,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nlist_uuid = '11111111-2222-3333-4444-555555555555'\nentry_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'\nresp = requests.delete(\n f'https://verification.didit.me/v3/lists/{list_uuid}/entries/{entry_uuid}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nprint('Deleted:', resp.status_code == 204)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.lists.entries.delete(\n \"11111111-2222-3333-4444-555555555555\",\n \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\n)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const listUuid = '11111111-2222-3333-4444-555555555555';\nconst entryUuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee';\nconst resp = await fetch(\n `https://verification.didit.me/v3/lists/${listUuid}/entries/${entryUuid}/`,\n { method: 'DELETE', headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n);\nif (resp.status !== 204) throw new Error(`Delete failed: ${resp.status}`);\nconsole.log('Entry deleted');" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.lists.entries.delete(\n \"11111111-2222-3333-4444-555555555555\",\n \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\n);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Lists.Entries.Delete(ctx, \"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.lists().entries().delete(\"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "lists->entries->delete('11111111-2222-3333-4444-555555555555', 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.lists.entries.delete(\n \"11111111-2222-3333-4444-555555555555\",\n \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"\n)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Lists.Entries.DeleteAsync(\"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\");" } ], "responses": { @@ -58049,7 +67486,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -58161,12 +67598,37 @@ { "lang": "python", "label": "Python", - "source": "import base64\nimport os\n\nimport requests\n\nlist_uuid = '11111111-2222-3333-4444-555555555555'\nwith open('face.jpg', 'rb') as image_file:\n image_b64 = base64.b64encode(image_file.read()).decode('ascii')\n\nresp = requests.post(\n f'https://verification.didit.me/v3/lists/{list_uuid}/entries/face-upload/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={'image': image_b64, 'comment': 'Known fraud attempt'},\n timeout=10,\n)\nresp.raise_for_status()\nprint('Face entry', resp.json()['uuid'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.lists.entries.upload_face(\n \"11111111-2222-3333-4444-555555555555\",\n image=\"/9j/4AAQSkZJRgABAQAAAQABAAD...\",\n comment=\"Known fraud attempt\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import { readFile } from 'node:fs/promises';\n\nconst listUuid = '11111111-2222-3333-4444-555555555555';\nconst image = (await readFile('face.jpg')).toString('base64');\nconst resp = await fetch(`https://verification.didit.me/v3/lists/${listUuid}/entries/face-upload/`, {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ image, comment: 'Known fraud attempt' }),\n});\nif (!resp.ok) throw new Error(`Upload failed: ${resp.status} ${await resp.text()}`);\nconst entry = await resp.json();\nconsole.log('Face entry', entry.uuid);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.lists.entries.uploadFace(\"11111111-2222-3333-4444-555555555555\", {\n image: \"/9j/4AAQSkZJRgABAQAAAQABAAD...\",\n comment: \"Known fraud attempt\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Lists.Entries.UploadFace(ctx, \"11111111-2222-3333-4444-555555555555\", didit.ListsEntriesUploadFaceParams{\n\tImage: \"/9j/4AAQSkZJRgABAQAAAQABAAD...\",\n\tComment: didit.String(\"Known fraud attempt\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.ListsEntriesUploadFaceParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.lists().entries().uploadFace(\"11111111-2222-3333-4444-555555555555\", ListsEntriesUploadFaceParams.builder()\n .image(\"/9j/4AAQSkZJRgABAQAAAQABAAD...\")\n .comment(\"Known fraud attempt\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "lists->entries->uploadFace('11111111-2222-3333-4444-555555555555', [\n 'image' => '/9j/4AAQSkZJRgABAQAAAQABAAD...',\n 'comment' => 'Known fraud attempt',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.lists.entries.upload_face(\n \"11111111-2222-3333-4444-555555555555\",\n image: \"/9j/4AAQSkZJRgABAQAAAQABAAD...\",\n comment: \"Known fraud attempt\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Lists.Entries.UploadFaceAsync(\"11111111-2222-3333-4444-555555555555\", new ListsEntriesUploadFaceParams\n{\n Image = \"/9j/4AAQSkZJRgABAQAAAQABAAD...\",\n Comment = \"Known fraud attempt\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -58286,7 +67748,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -58407,12 +67869,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/blocklist/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'item_type': 'document'},\n timeout=10,\n)\nresp.raise_for_status()\nfor item in resp.json()['results']:\n print(item['session_id'], item['document_type'], item['document_number'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.blocklist.list():\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/blocklist/?item_type=document', {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst page = await resp.json();\nconsole.log(page.count, page.results);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.blocklist.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Blocklist.ListAutoPaging(ctx, didit.BlocklistListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.blocklist().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "blocklist->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.blocklist.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Blocklist.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -58530,7 +68017,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: read` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: read` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -58649,12 +68136,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/blocklist/add/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={\n 'session_id': '33333333-4444-5555-6666-777777777777',\n 'blocklist_face': True,\n 'blocklist_document': True,\n },\n timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json()['message'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.blocklist.add(\n session_id=\"33333333-4444-5555-6666-777777777777\",\n blocklist_face=True,\n blocklist_document=True,\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/blocklist/add/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n session_id: '33333333-4444-5555-6666-777777777777',\n blocklist_face: true,\n blocklist_document: true,\n }),\n});\nif (!resp.ok) throw new Error(`Blocklist failed: ${resp.status} ${await resp.text()}`);\nconsole.log((await resp.json()).message);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.blocklist.add({\n session_id: \"33333333-4444-5555-6666-777777777777\",\n blocklist_face: true,\n blocklist_document: true,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Blocklist.Add(ctx, didit.BlocklistAddParams{\n\tSessionID: \"33333333-4444-5555-6666-777777777777\",\n\tBlocklistFace: didit.Bool(true),\n\tBlocklistDocument: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.BlocklistAddParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.blocklist().add(BlocklistAddParams.builder()\n .sessionId(\"33333333-4444-5555-6666-777777777777\")\n .blocklistFace(true)\n .blocklistDocument(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "blocklist->add([\n 'session_id' => '33333333-4444-5555-6666-777777777777',\n 'blocklist_face' => true,\n 'blocklist_document' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.blocklist.add(\n session_id: \"33333333-4444-5555-6666-777777777777\",\n blocklist_face: true,\n blocklist_document: true\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Blocklist.AddAsync(new BlocklistAddParams\n{\n SessionId = \"33333333-4444-5555-6666-777777777777\",\n BlocklistFace = true,\n BlocklistDocument = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -58750,7 +68262,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -58852,12 +68364,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/blocklist/remove/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={\n 'session_id': '33333333-4444-5555-6666-777777777777',\n 'unblock_face': True,\n 'unblock_document': True,\n },\n timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json()['message'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.blocklist.remove(\n session_id=\"33333333-4444-5555-6666-777777777777\",\n unblock_face=True,\n unblock_document=True,\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/blocklist/remove/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n session_id: '33333333-4444-5555-6666-777777777777',\n unblock_face: true,\n unblock_document: true,\n }),\n});\nif (!resp.ok) throw new Error(`Unblock failed: ${resp.status} ${await resp.text()}`);\nconsole.log((await resp.json()).message);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.blocklist.remove({\n session_id: \"33333333-4444-5555-6666-777777777777\",\n unblock_face: true,\n unblock_document: true,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Blocklist.Remove(ctx, didit.BlocklistRemoveParams{\n\tSessionID: \"33333333-4444-5555-6666-777777777777\",\n\tUnblockFace: didit.Bool(true),\n\tUnblockDocument: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.BlocklistRemoveParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.blocklist().remove(BlocklistRemoveParams.builder()\n .sessionId(\"33333333-4444-5555-6666-777777777777\")\n .unblockFace(true)\n .unblockDocument(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "blocklist->remove([\n 'session_id' => '33333333-4444-5555-6666-777777777777',\n 'unblock_face' => true,\n 'unblock_document' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.blocklist.remove(\n session_id: \"33333333-4444-5555-6666-777777777777\",\n unblock_face: true,\n unblock_document: true\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Blocklist.RemoveAsync(new BlocklistRemoveParams\n{\n SessionId = \"33333333-4444-5555-6666-777777777777\",\n UnblockFace = true,\n UnblockDocument = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -58946,7 +68483,7 @@ } }, "403": { - "description": "The `x-api-key` header is missing or invalid, or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", + "description": "The `x-api-key` header is missing (a wrong, revoked or expired key gets `401`), or a scoped API key lacks `workflows: write` or is used from an IP address outside its allowlist.", "content": { "application/json": { "examples": { @@ -58999,12 +68536,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/webhook/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nconfig = resp.json()\nfor destination in config['endpoints']:\n print(destination['label'], destination['url'], destination['subscribed_events'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.retrieve_config()\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/webhook/', {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst config = await resp.json();\nfor (const destination of config.endpoints) {\n console.log(destination.label, destination.url, destination.subscribed_events);\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.retrieveConfig();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.RetrieveConfig(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().retrieveConfig();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->retrieveConfig();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.retrieve_config\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.RetrieveConfigAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -59098,7 +68660,7 @@ } }, "401": { - "description": "The API key has expired: it was created with an expiry date that has passed. A missing, invalid or revoked key gets `403`, not `401`.", + "description": "The API key has expired: it was created with an expiry date that has passed. A wrong or revoked key also gets `401`; a missing key gets `403`.", "content": { "application/json": { "schema": { @@ -59311,6 +68873,18 @@ "type": "string", "maxLength": 253 } + }, + "allowed_domains": { + "type": "array", + "maxItems": 50, + "items": { + "type": "string", + "maxLength": 300 + }, + "description": "Replaces the whole list of allowed origins. Origins (for example `https://app.example.com`; `http` only for `localhost`) the hosted verification flow may be embedded in and may send the user back to with a session callback. Server-to-server calls are not affected. An empty list means no restriction. Didit stores each origin in lower case without a default port. An invalid entry fails with `400` on `allowed_domains`. Send `[]` to remove the restriction.", + "example": [ + "https://app.example.com" + ] } } }, @@ -59353,12 +68927,32 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.patch(\n 'https://verification.didit.me/v3/webhook/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={'face_retention_policy': 'retain_until_user_deleted', 'face_retention_days': 365},\n timeout=10,\n)\nresp.raise_for_status()\nconfig = resp.json()\nprint(config['face_retention_policy'], config['face_retention_days'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.update_config(\n face_retention_policy=\"retain_until_user_deleted\",\n face_retention_days=365,\n biometric_consent_mode=\"auto\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/webhook/', {\n method: 'PATCH',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ face_retention_policy: 'retain_until_user_deleted', face_retention_days: 365 }),\n});\nif (!resp.ok) throw new Error(await resp.text());\nconst config = await resp.json();\nconsole.log(config.face_retention_policy, config.face_retention_days);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.updateConfig({\n face_retention_policy: \"retain_until_user_deleted\",\n face_retention_days: 365,\n biometric_consent_mode: \"auto\",\n});\nconsole.log(result);" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.WebhooksUpdateConfigParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().updateConfig(WebhooksUpdateConfigParams.builder()\n .faceRetentionPolicy(WebhooksUpdateConfigParams.FaceRetentionPolicy.of(\"retain_until_user_deleted\"))\n .faceRetentionDays(365L)\n .biometricConsentMode(WebhooksUpdateConfigParams.BiometricConsentMode.of(\"auto\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->updateConfig([\n 'face_retention_policy' => 'retain_until_user_deleted',\n 'face_retention_days' => 365,\n 'biometric_consent_mode' => 'auto',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.update_config(\n face_retention_policy: \"retain_until_user_deleted\",\n face_retention_days: 365,\n biometric_consent_mode: \"auto\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.UpdateConfigAsync(new WebhooksUpdateConfigParams\n{\n FaceRetentionPolicy = new WebhooksUpdateConfigParamsFaceRetentionPolicy(\"retain_until_user_deleted\"),\n FaceRetentionDays = 365,\n BiometricConsentMode = new WebhooksUpdateConfigParamsBiometricConsentMode(\"auto\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -59500,7 +69094,7 @@ } }, "401": { - "description": "The API key has expired: it was created with an expiry date that has passed. A missing, invalid or revoked key gets `403`, not `401`.", + "description": "The API key has expired: it was created with an expiry date that has passed. A wrong or revoked key also gets `401`; a missing key gets `403`.", "content": { "application/json": { "schema": { @@ -59682,12 +69276,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\ndestination_uuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.get(\n f'https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/analytics/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'date_from': '2026-10-01', 'date_to': '2026-10-16'},\n timeout=10,\n)\nresp.raise_for_status()\nsummary = resp.json()['summary']\nprint(f\"{summary['failed_deliveries']} of {summary['total_deliveries']} failed ({summary['error_rate_percentage']}%)\")" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.retrieve_analytics(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const destinationUuid = '11111111-2222-3333-4444-555555555555';\nconst params = new URLSearchParams({ date_from: '2026-10-01', date_to: '2026-10-16' });\nconst resp = await fetch(`https://verification.didit.me/v3/webhook/destinations/${destinationUuid}/analytics/?${params}`, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst { summary, points } = await resp.json();\nconsole.log(summary.error_rate_percentage, points.length);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.retrieveAnalytics(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.RetrieveAnalytics(ctx, \"11111111-2222-3333-4444-555555555555\", didit.WebhooksDestinationsRetrieveAnalyticsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().retrieveAnalytics(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->destinations->retrieveAnalytics('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.retrieve_analytics(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.RetrieveAnalyticsAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -59886,7 +69505,7 @@ } }, "401": { - "description": "The API key has expired: it was created with an expiry date that has passed. A missing, invalid or revoked key gets `403`, not `401`.", + "description": "The API key has expired: it was created with an expiry date that has passed. A wrong or revoked key also gets `401`; a missing key gets `403`.", "content": { "application/json": { "schema": { @@ -60117,12 +69736,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\ndestination_uuid = '11111111-2222-3333-4444-555555555555'\nurl = f'https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/'\nparams = {'limit': 50, 'date_from': '2026-10-01'}\n\nwhile url:\n resp = requests.get(\n url,\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params=params,\n timeout=10,\n )\n resp.raise_for_status()\n page = resp.json()\n for delivery in page['results']:\n if delivery['response_status'] is None or delivery['response_status'] >= 400:\n print(delivery['uuid'], delivery['webhook_type'], delivery['response_status'])\n url, params = page['next'], None # next already carries the query string" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.webhooks.destinations.list_deliveries(\n \"11111111-2222-3333-4444-555555555555\",\n):\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const destinationUuid = '11111111-2222-3333-4444-555555555555';\nlet url = `https://verification.didit.me/v3/webhook/destinations/${destinationUuid}/deliveries/?limit=50&date_from=2026-10-01`;\nwhile (url) {\n const resp = await fetch(url, { headers: { 'x-api-key': process.env.DIDIT_API_KEY } });\n if (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\n const page = await resp.json();\n for (const delivery of page.results) {\n if (delivery.response_status === null || delivery.response_status >= 400) {\n console.log(delivery.uuid, delivery.webhook_type, delivery.response_status);\n }\n }\n url = page.next;\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.webhooks.destinations.listDeliveries(\"11111111-2222-3333-4444-555555555555\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Webhooks.Destinations.ListDeliveriesAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.WebhooksDestinationsListDeliveriesParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.webhooks().destinations().listDeliveries(\"11111111-2222-3333-4444-555555555555\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->destinations->listDeliveries('11111111-2222-3333-4444-555555555555') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.webhooks.destinations.list_deliveries(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Webhooks.Destinations.ListDeliveriesAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -60237,7 +69881,7 @@ } }, "401": { - "description": "The API key has expired: it was created with an expiry date that has passed. A missing, invalid or revoked key gets `403`, not `401`.", + "description": "The API key has expired: it was created with an expiry date that has passed. A wrong or revoked key also gets `401`; a missing key gets `403`.", "content": { "application/json": { "schema": { @@ -60441,12 +70085,37 @@ { "lang": "python", "label": "Python", - "source": "import json\nimport os\n\nimport requests\n\ndestination_uuid = '11111111-2222-3333-4444-555555555555'\ndelivery_uuid = '66666666-7777-8888-9999-000000000001'\nresp = requests.get(\n f'https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\ndelivery = resp.json()\nheaders = json.loads(delivery['request_header'])\npayload = json.loads(delivery['request_body'])\nprint(delivery['response_status'], headers['X-Signature-V2'], payload['event_id'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.retrieve_delivery(\n \"11111111-2222-3333-4444-555555555555\",\n \"66666666-7777-8888-9999-000000000001\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const destinationUuid = '11111111-2222-3333-4444-555555555555';\nconst deliveryUuid = '66666666-7777-8888-9999-000000000001';\nconst resp = await fetch(\n `https://verification.didit.me/v3/webhook/destinations/${destinationUuid}/deliveries/${deliveryUuid}/`,\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n);\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst delivery = await resp.json();\nconst headers = JSON.parse(delivery.request_header);\nconst payload = JSON.parse(delivery.request_body);\nconsole.log(delivery.response_status, headers['X-Signature-V2'], payload.event_id);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.retrieveDelivery(\n \"11111111-2222-3333-4444-555555555555\",\n \"66666666-7777-8888-9999-000000000001\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.RetrieveDelivery(ctx, \"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().retrieveDelivery(\"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->destinations->retrieveDelivery('11111111-2222-3333-4444-555555555555', '66666666-7777-8888-9999-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.retrieve_delivery(\n \"11111111-2222-3333-4444-555555555555\",\n \"66666666-7777-8888-9999-000000000001\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.RetrieveDeliveryAsync(\"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -60477,7 +70146,7 @@ } }, "401": { - "description": "The API key has expired: it was created with an expiry date that has passed. A missing, invalid or revoked key gets `403`, not `401`.", + "description": "The API key has expired: it was created with an expiry date that has passed. A wrong or revoked key also gets `401`; a missing key gets `403`.", "content": { "application/json": { "schema": { @@ -60686,12 +70355,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\ndestination_uuid = '11111111-2222-3333-4444-555555555555'\ndelivery_uuid = '66666666-7777-8888-9999-000000000001'\nresp = requests.post(\n f'https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nresent = resp.json()\nif resent['response_status'] is None or resent['response_status'] >= 400:\n print('Your endpoint still rejects it:', resent['response_status'])\nelse:\n print('Delivered as', resent['uuid'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.resend_delivery(\n \"11111111-2222-3333-4444-555555555555\",\n \"66666666-7777-8888-9999-000000000001\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const destinationUuid = '11111111-2222-3333-4444-555555555555';\nconst deliveryUuid = '66666666-7777-8888-9999-000000000001';\nconst resp = await fetch(\n `https://verification.didit.me/v3/webhook/destinations/${destinationUuid}/deliveries/${deliveryUuid}/resend/`,\n { method: 'POST', headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n);\nif (!resp.ok) throw new Error(await resp.text());\nconst resent = await resp.json();\nconsole.log(resent.uuid, resent.response_status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.resendDelivery(\n \"11111111-2222-3333-4444-555555555555\",\n \"66666666-7777-8888-9999-000000000001\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.ResendDelivery(ctx, \"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().resendDelivery(\"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "webhooks->destinations->resendDelivery('11111111-2222-3333-4444-555555555555', '66666666-7777-8888-9999-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.resend_delivery(\n \"11111111-2222-3333-4444-555555555555\",\n \"66666666-7777-8888-9999-000000000001\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.ResendDeliveryAsync(\"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -60750,7 +70444,7 @@ } }, "401": { - "description": "The API key has expired: it was created with an expiry date that has passed. A missing, invalid or revoked key gets `403`, not `401`.", + "description": "The API key has expired: it was created with an expiry date that has passed. A wrong or revoked key also gets `401`; a missing key gets `403`.", "content": { "application/json": { "schema": { @@ -61215,12 +70909,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nurl = 'https://verification.didit.me/v3/events/'\nparams = {\n 'event_category': ['payment', 'dispute'],\n 'matched_only': 'true',\n 'occurred_from': '2026-10-01T00:00:00Z',\n 'limit': 50,\n}\nwhile url:\n resp = requests.get(\n url,\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params=params,\n timeout=10,\n )\n resp.raise_for_status()\n page = resp.json()\n for event in page['results']:\n print(event['event_uuid'], event['action_type'], event['status'])\n url, params = page['next'], None" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.monitoring_events.list():\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const params = new URLSearchParams([\n ['event_category', 'payment'],\n ['event_category', 'dispute'],\n ['matched_only', 'true'],\n ['occurred_from', '2026-10-01T00:00:00Z'],\n ['limit', '50'],\n]);\nlet url = `https://verification.didit.me/v3/events/?${params}`;\nwhile (url) {\n const resp = await fetch(url, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n });\n if (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\n const page = await resp.json();\n for (const event of page.results) console.log(event.event_uuid, event.action_type, event.status);\n url = page.next;\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.monitoringEvents.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.MonitoringEvents.ListAutoPaging(ctx, didit.MonitoringEventsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.monitoringEvents().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "monitoringEvents->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.monitoring_events.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.MonitoringEvents.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -61339,7 +71058,7 @@ } }, "403": { - "description": "Missing or invalid `x-api-key` (this endpoint answers `403`, never `401`, for a missing or invalid key), a scoped key without `transactions: read`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist.", + "description": "A missing `x-api-key` (a wrong, revoked or expired key gets `401`), a scoped key without `transactions: read`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist.", "content": { "application/json": { "examples": { @@ -61500,12 +71219,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/events/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={\n 'event_id': 'login-2026-10-17-000001',\n 'event_category': 'auth',\n 'action_type': 'login',\n 'occurred_at': '2026-10-17T09:15:02.481Z',\n 'subject': {'vendor_data': 'user-42', 'entity_type': 'individual'},\n 'session': {'session_id': 'web-session-abc', 'sequence': 142},\n 'device_context': {\n 'fingerprint': 'fp-a8c1',\n 'network_context': {'ip_address': '203.0.113.42'},\n },\n 'payload': {'method': 'password'},\n },\n timeout=10,\n)\nresp.raise_for_status()\nresult = resp.json()\nprint(result['event_uuid'], result['status'], result['idempotent_replay'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.monitoring_events.create(\n event_id=\"login-2026-10-17-000001\",\n event_category=\"auth\",\n action_type=\"login\",\n occurred_at=\"2026-10-17T09:15:02.481Z\",\n time_zone=\"Europe/Madrid\",\n subject={\n \"vendor_data\": \"user-42\",\n \"entity_type\": \"individual\",\n },\n session={\n \"session_id\": \"web-session-abc\",\n \"sequence\": 142,\n },\n device_context={\n \"fingerprint\": \"fp-a8c1\",\n \"network_context\": {\n \"ip_address\": \"203.0.113.42\",\n },\n },\n payload={\"method\": \"password\"},\n custom_values={\"vip_tier\": \"gold\"},\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/events/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n event_id: 'login-2026-10-17-000001',\n event_category: 'auth',\n action_type: 'login',\n occurred_at: '2026-10-17T09:15:02.481Z',\n subject: { vendor_data: 'user-42', entity_type: 'individual' },\n session: { session_id: 'web-session-abc', sequence: 142 },\n device_context: {\n fingerprint: 'fp-a8c1',\n network_context: { ip_address: '203.0.113.42' },\n },\n payload: { method: 'password' },\n }),\n});\nif (!resp.ok) throw new Error(await resp.text());\nconst result = await resp.json();\nconsole.log(result.event_uuid, result.status, result.idempotent_replay);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.monitoringEvents.create({\n event_id: \"login-2026-10-17-000001\",\n event_category: \"auth\",\n action_type: \"login\",\n occurred_at: \"2026-10-17T09:15:02.481Z\",\n time_zone: \"Europe/Madrid\",\n subject: {\n vendor_data: \"user-42\",\n entity_type: \"individual\",\n },\n session: {\n session_id: \"web-session-abc\",\n sequence: 142,\n },\n device_context: {\n fingerprint: \"fp-a8c1\",\n network_context: {\n ip_address: \"203.0.113.42\",\n },\n },\n payload: { method: \"password\" },\n custom_values: { vip_tier: \"gold\" },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.Create(ctx, didit.MonitoringEventCreateRequest{\n\tEventID: \"login-2026-10-17-000001\",\n\tEventCategory: \"auth\",\n\tActionType: \"login\",\n\tOccurredAt: time.Date(2026, 10, 17, 9, 15, 2, 0, time.UTC),\n\tTimeZone: didit.String(\"Europe/Madrid\"),\n\tSubject: didit.MonitoringEventCreateRequestSubject{\n\t\tVendorData: \"user-42\",\n\t\tEntityType: didit.String(\"individual\"),\n\t},\n\tSession: didit.Some(didit.MonitoringEventCreateRequestSession{\n\t\tSessionID: didit.String(\"web-session-abc\"),\n\t\tSequence: didit.Int(142),\n\t}),\n\tDeviceContext: didit.Some(didit.MonitoringEventCreateRequestDeviceContext{\n\t\tFingerprint: didit.String(\"fp-a8c1\"),\n\t\tNetworkContext: didit.Some(didit.MonitoringEventCreateRequestDeviceContextNetworkContext{\n\t\t\tIPAddress: didit.String(\"203.0.113.42\"),\n\t\t}),\n\t}),\n\tPayload: didit.Some(map[string]any{\"method\": \"password\"}),\n\tCustomValues: didit.Some(map[string]any{\"vip_tier\": \"gold\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.OffsetDateTime;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.MonitoringEventCreateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.monitoringEvents().create(MonitoringEventCreateRequest.builder()\n .eventId(\"login-2026-10-17-000001\")\n .eventCategory(MonitoringEventCreateRequest.EventCategory.of(\"auth\"))\n .actionType(\"login\")\n .occurredAt(OffsetDateTime.parse(\"2026-10-17T09:15:02.481Z\"))\n .timeZone(\"Europe/Madrid\")\n .subject(MonitoringEventCreateRequest.Subject.builder()\n .vendorData(\"user-42\")\n .entityType(\"individual\")\n .build())\n .session(MonitoringEventCreateRequest.Session.builder()\n .sessionId(\"web-session-abc\")\n .sequence(142L)\n .build())\n .deviceContext(MonitoringEventCreateRequest.DeviceContext.builder()\n .fingerprint(\"fp-a8c1\")\n .networkContext(MonitoringEventCreateRequest.DeviceContext.NetworkContext.builder()\n .ipAddress(\"203.0.113.42\")\n .build())\n .build())\n .payload(Map.of(\"method\", \"password\"))\n .customValues(Map.of(\"vip_tier\", MonitoringEventCreateRequest.CustomValuesValue.ofString(\"gold\")))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "monitoringEvents->create([\n 'event_id' => 'login-2026-10-17-000001',\n 'event_category' => 'auth',\n 'action_type' => 'login',\n 'occurred_at' => '2026-10-17T09:15:02.481Z',\n 'time_zone' => 'Europe/Madrid',\n 'subject' => [\n 'vendor_data' => 'user-42',\n 'entity_type' => 'individual',\n ],\n 'session' => [\n 'session_id' => 'web-session-abc',\n 'sequence' => 142,\n ],\n 'device_context' => [\n 'fingerprint' => 'fp-a8c1',\n 'network_context' => [\n 'ip_address' => '203.0.113.42',\n ],\n ],\n 'payload' => ['method' => 'password'],\n 'custom_values' => ['vip_tier' => 'gold'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.monitoring_events.create(\n event_id: \"login-2026-10-17-000001\",\n event_category: \"auth\",\n action_type: \"login\",\n occurred_at: \"2026-10-17T09:15:02.481Z\",\n time_zone: \"Europe/Madrid\",\n subject: {\n vendor_data: \"user-42\",\n entity_type: \"individual\",\n },\n session: {\n session_id: \"web-session-abc\",\n sequence: 142,\n },\n device_context: {\n fingerprint: \"fp-a8c1\",\n network_context: {\n ip_address: \"203.0.113.42\",\n },\n },\n payload: { method: \"password\" },\n custom_values: { vip_tier: \"gold\" }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.MonitoringEvents.CreateAsync(new MonitoringEventCreateRequest\n{\n EventId = \"login-2026-10-17-000001\",\n EventCategory = \"auth\",\n ActionType = \"login\",\n OccurredAt = DateTimeOffset.Parse(\"2026-10-17T09:15:02.481Z\"),\n TimeZone = \"Europe/Madrid\",\n Subject = new()\n {\n VendorData = \"user-42\",\n EntityType = \"individual\",\n },\n Session = new MonitoringEventCreateRequestSession\n {\n SessionId = \"web-session-abc\",\n Sequence = 142,\n },\n DeviceContext = new MonitoringEventCreateRequestDeviceContext\n {\n Fingerprint = \"fp-a8c1\",\n NetworkContext = new MonitoringEventCreateRequestDeviceContextNetworkContext\n {\n IpAddress = \"203.0.113.42\",\n },\n },\n Payload = new Dictionary { [\"method\"] = \"password\" },\n CustomValues = new Dictionary { [\"vip_tier\"] = \"gold\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -61691,7 +71435,7 @@ } }, "403": { - "description": "Missing or invalid `x-api-key` (this endpoint answers `403`, never `401`, for a missing or invalid key), a scoped key without `transactions: write`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist. Also returned with `code: event_monitoring_disabled` while event ingestion is switched off for the application; nothing is stored in that case, and the check runs before the body is validated.", + "description": "A missing `x-api-key` (a wrong, revoked or expired key gets `401`), a scoped key without `transactions: write`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist. Also returned with `code: event_monitoring_disabled` while event ingestion is switched off for the application; nothing is stored in that case, and the check runs before the body is validated.", "content": { "application/json": { "examples": { @@ -61849,12 +71593,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nevents = [\n {\n 'event_id': 'login-2026-10-17-000001',\n 'event_category': 'auth',\n 'action_type': 'login',\n 'occurred_at': '2026-10-17T09:15:02.481Z',\n 'subject': {'vendor_data': 'user-42'},\n },\n {\n 'event_id': 'deposit-2026-10-17-000002',\n 'event_category': 'payment',\n 'action_type': 'deposit_completed',\n 'occurred_at': '2026-10-17T09:16:40.000Z',\n 'subject': {'vendor_data': 'user-42'},\n 'transaction_context': {'amount': '100.00', 'currency': 'EUR', 'payment_reference_id': 'dep_736'},\n 'payload': {'payment_method': 'card', 'status': 'completed'},\n },\n]\nresp = requests.post(\n 'https://verification.didit.me/v3/events/batch/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={'events': events},\n timeout=10,\n)\nresp.raise_for_status() # 201 and 207 are both success\nbatch = resp.json()\nfor item in batch['results']:\n if item['outcome'] == 'rejected':\n print('fix and resend', events[item['index']]['event_id'], item['errors'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.monitoring_events.create_batch(\n events=[{\n \"event_id\": \"login-2026-10-17-000001\",\n \"event_category\": \"auth\",\n \"action_type\": \"login\",\n \"occurred_at\": \"2026-10-17T09:15:02.481Z\",\n \"subject\": {\n \"vendor_data\": \"user-42\",\n },\n }, {\n \"event_id\": \"deposit-2026-10-17-000002\",\n \"event_category\": \"payment\",\n \"action_type\": \"deposit_completed\",\n \"occurred_at\": \"2026-10-17T09:16:40Z\",\n \"subject\": {\n \"vendor_data\": \"user-42\",\n },\n \"transaction_context\": {\n \"amount\": \"100.00\",\n \"currency\": \"EUR\",\n \"payment_reference_id\": \"dep_736\",\n },\n \"payload\": {\"payment_method\": \"card\", \"status\": \"completed\"},\n }],\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const events = [\n {\n event_id: 'login-2026-10-17-000001',\n event_category: 'auth',\n action_type: 'login',\n occurred_at: '2026-10-17T09:15:02.481Z',\n subject: { vendor_data: 'user-42' },\n },\n {\n event_id: 'deposit-2026-10-17-000002',\n event_category: 'payment',\n action_type: 'deposit_completed',\n occurred_at: '2026-10-17T09:16:40.000Z',\n subject: { vendor_data: 'user-42' },\n transaction_context: { amount: '100.00', currency: 'EUR', payment_reference_id: 'dep_736' },\n payload: { payment_method: 'card', status: 'completed' },\n },\n];\nconst resp = await fetch('https://verification.didit.me/v3/events/batch/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ events }),\n});\nif (!resp.ok) throw new Error(await resp.text()); // 201 and 207 are both ok\nconst batch = await resp.json();\nfor (const item of batch.results) {\n if (item.outcome === 'rejected') console.log('fix and resend', events[item.index].event_id, item.errors);\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.monitoringEvents.createBatch({\n events: [{\n event_id: \"login-2026-10-17-000001\",\n event_category: \"auth\",\n action_type: \"login\",\n occurred_at: \"2026-10-17T09:15:02.481Z\",\n subject: {\n vendor_data: \"user-42\",\n },\n }, {\n event_id: \"deposit-2026-10-17-000002\",\n event_category: \"payment\",\n action_type: \"deposit_completed\",\n occurred_at: \"2026-10-17T09:16:40Z\",\n subject: {\n vendor_data: \"user-42\",\n },\n transaction_context: {\n amount: \"100.00\",\n currency: \"EUR\",\n payment_reference_id: \"dep_736\",\n },\n payload: { payment_method: \"card\", status: \"completed\" },\n }],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.CreateBatch(ctx, didit.MonitoringEventsCreateBatchParams{\n\tEvents: []didit.MonitoringEventCreateRequest{{\n\t\tEventID: \"login-2026-10-17-000001\",\n\t\tEventCategory: \"auth\",\n\t\tActionType: \"login\",\n\t\tOccurredAt: time.Date(2026, 10, 17, 9, 15, 2, 0, time.UTC),\n\t\tSubject: didit.MonitoringEventCreateRequestSubject{\n\t\t\tVendorData: \"user-42\",\n\t\t},\n\t}, {\n\t\tEventID: \"deposit-2026-10-17-000002\",\n\t\tEventCategory: \"payment\",\n\t\tActionType: \"deposit_completed\",\n\t\tOccurredAt: time.Date(2026, 10, 17, 9, 16, 40, 0, time.UTC),\n\t\tSubject: didit.MonitoringEventCreateRequestSubject{\n\t\t\tVendorData: \"user-42\",\n\t\t},\n\t\tTransactionContext: didit.Some(didit.MonitoringEventCreateRequestTransactionContext{\n\t\t\tAmount: didit.String(\"100.00\"),\n\t\t\tCurrency: didit.String(\"EUR\"),\n\t\t\tPaymentReferenceID: didit.String(\"dep_736\"),\n\t\t}),\n\t\tPayload: didit.Some(map[string]any{\"payment_method\": \"card\", \"status\": \"completed\"}),\n\t}},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.OffsetDateTime;\nimport java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.MonitoringEventCreateRequest;\nimport me.didit.types.MonitoringEventsCreateBatchParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.monitoringEvents().createBatch(MonitoringEventsCreateBatchParams.builder()\n .events(List.of(\n MonitoringEventCreateRequest.builder()\n .eventId(\"login-2026-10-17-000001\")\n .eventCategory(MonitoringEventCreateRequest.EventCategory.of(\"auth\"))\n .actionType(\"login\")\n .occurredAt(OffsetDateTime.parse(\"2026-10-17T09:15:02.481Z\"))\n .subject(MonitoringEventCreateRequest.Subject.builder()\n .vendorData(\"user-42\")\n .build())\n .build(),\n MonitoringEventCreateRequest.builder()\n .eventId(\"deposit-2026-10-17-000002\")\n .eventCategory(MonitoringEventCreateRequest.EventCategory.of(\"payment\"))\n .actionType(\"deposit_completed\")\n .occurredAt(OffsetDateTime.parse(\"2026-10-17T09:16:40Z\"))\n .subject(MonitoringEventCreateRequest.Subject.builder()\n .vendorData(\"user-42\")\n .build())\n .transactionContext(MonitoringEventCreateRequest.TransactionContext.builder()\n .amount(\"100.00\")\n .currency(\"EUR\")\n .paymentReferenceId(\"dep_736\")\n .build())\n .payload(Map.of(\"payment_method\", \"card\", \"status\", \"completed\"))\n .build()))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "monitoringEvents->createBatch([\n 'events' => [[\n 'event_id' => 'login-2026-10-17-000001',\n 'event_category' => 'auth',\n 'action_type' => 'login',\n 'occurred_at' => '2026-10-17T09:15:02.481Z',\n 'subject' => [\n 'vendor_data' => 'user-42',\n ],\n ], [\n 'event_id' => 'deposit-2026-10-17-000002',\n 'event_category' => 'payment',\n 'action_type' => 'deposit_completed',\n 'occurred_at' => '2026-10-17T09:16:40Z',\n 'subject' => [\n 'vendor_data' => 'user-42',\n ],\n 'transaction_context' => [\n 'amount' => '100.00',\n 'currency' => 'EUR',\n 'payment_reference_id' => 'dep_736',\n ],\n 'payload' => ['payment_method' => 'card', 'status' => 'completed'],\n ]],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.monitoring_events.create_batch(\n events: [{\n event_id: \"login-2026-10-17-000001\",\n event_category: \"auth\",\n action_type: \"login\",\n occurred_at: \"2026-10-17T09:15:02.481Z\",\n subject: {\n vendor_data: \"user-42\",\n },\n }, {\n event_id: \"deposit-2026-10-17-000002\",\n event_category: \"payment\",\n action_type: \"deposit_completed\",\n occurred_at: \"2026-10-17T09:16:40Z\",\n subject: {\n vendor_data: \"user-42\",\n },\n transaction_context: {\n amount: \"100.00\",\n currency: \"EUR\",\n payment_reference_id: \"dep_736\",\n },\n payload: { payment_method: \"card\", status: \"completed\" },\n }]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.MonitoringEvents.CreateBatchAsync(new MonitoringEventsCreateBatchParams\n{\n Events = new MonitoringEventCreateRequest[]\n {\n new()\n {\n EventId = \"login-2026-10-17-000001\",\n EventCategory = \"auth\",\n ActionType = \"login\",\n OccurredAt = DateTimeOffset.Parse(\"2026-10-17T09:15:02.481Z\"),\n Subject = new()\n {\n VendorData = \"user-42\",\n },\n },\n new()\n {\n EventId = \"deposit-2026-10-17-000002\",\n EventCategory = \"payment\",\n ActionType = \"deposit_completed\",\n OccurredAt = DateTimeOffset.Parse(\"2026-10-17T09:16:40Z\"),\n Subject = new()\n {\n VendorData = \"user-42\",\n },\n TransactionContext = new MonitoringEventCreateRequestTransactionContext\n {\n Amount = \"100.00\",\n Currency = \"EUR\",\n PaymentReferenceId = \"dep_736\",\n },\n Payload = new Dictionary { [\"payment_method\"] = \"card\", [\"status\"] = \"completed\" },\n },\n },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -62300,7 +72069,7 @@ } }, "403": { - "description": "Missing or invalid `x-api-key` (this endpoint answers `403`, never `401`, for a missing or invalid key), a scoped key without `transactions: write`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist. Also returned with `code: event_monitoring_disabled` while event ingestion is switched off for the application; nothing is stored in that case, and the check runs before the body is validated.", + "description": "A missing `x-api-key` (a wrong, revoked or expired key gets `401`), a scoped key without `transactions: write`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist. Also returned with `code: event_monitoring_disabled` while event ingestion is switched off for the application; nothing is stored in that case, and the check runs before the body is validated.", "content": { "application/json": { "examples": { @@ -62467,12 +72236,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.post(\n 'https://verification.didit.me/v3/events/sdk-token/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={\n 'vendor_data': 'user-42',\n 'allowed_event_categories': ['auth', 'session', 'gameplay'],\n 'ttl_seconds': 900,\n 'max_uses': 1000,\n 'bind_to_origin': 'https://app.example.com',\n },\n timeout=10,\n)\nresp.raise_for_status()\ncredential = resp.json()\n# Hand only monitoring_token to the app, never the API key.\nprint(credential['monitoring_token'], credential['expires_at'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.monitoring_events.create_sdk_token(\n vendor_data=\"user-42\",\n allowed_event_categories=[\"auth\", \"session\", \"gameplay\"],\n ttl_seconds=900,\n max_uses=1000,\n bind_to_origin=\"https://app.example.com\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/events/sdk-token/', {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n vendor_data: 'user-42',\n allowed_event_categories: ['auth', 'session', 'gameplay'],\n ttl_seconds: 900,\n max_uses: 1000,\n bind_to_origin: 'https://app.example.com',\n }),\n});\nif (!resp.ok) throw new Error(await resp.text());\nconst { monitoring_token, expires_at } = await resp.json();\n// Hand only monitoring_token to the app, never the API key.\nconsole.log(monitoring_token, expires_at);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.monitoringEvents.createSdkToken({\n vendor_data: \"user-42\",\n allowed_event_categories: [\"auth\", \"session\", \"gameplay\"],\n ttl_seconds: 900,\n max_uses: 1000,\n bind_to_origin: \"https://app.example.com\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.CreateSDKToken(ctx, didit.MonitoringEventsCreateSDKTokenParams{\n\tVendorData: \"user-42\",\n\tAllowedEventCategories: didit.Some([]didit.MonitoringEventsCreateSDKTokenParamsAllowedEventCategories{\"auth\", \"session\", \"gameplay\"}),\n\tTTLSeconds: didit.Int(900),\n\tMaxUses: didit.Int(1000),\n\tBindToOrigin: didit.String(\"https://app.example.com\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.MonitoringEventsCreateSdkTokenParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.monitoringEvents().createSdkToken(MonitoringEventsCreateSdkTokenParams.builder()\n .vendorData(\"user-42\")\n .allowedEventCategories(List.of(MonitoringEventsCreateSdkTokenParams.AllowedEventCategories.of(\"auth\"), MonitoringEventsCreateSdkTokenParams.AllowedEventCategories.of(\"session\"), MonitoringEventsCreateSdkTokenParams.AllowedEventCategories.of(\"gameplay\")))\n .ttlSeconds(900L)\n .maxUses(1000L)\n .bindToOrigin(\"https://app.example.com\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "monitoringEvents->createSdkToken([\n 'vendor_data' => 'user-42',\n 'allowed_event_categories' => ['auth', 'session', 'gameplay'],\n 'ttl_seconds' => 900,\n 'max_uses' => 1000,\n 'bind_to_origin' => 'https://app.example.com',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.monitoring_events.create_sdk_token(\n vendor_data: \"user-42\",\n allowed_event_categories: [\"auth\", \"session\", \"gameplay\"],\n ttl_seconds: 900,\n max_uses: 1000,\n bind_to_origin: \"https://app.example.com\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.MonitoringEvents.CreateSdkTokenAsync(new MonitoringEventsCreateSdkTokenParams\n{\n VendorData = \"user-42\",\n AllowedEventCategories = new MonitoringEventsCreateSdkTokenParamsAllowedEventCategories[] { \"auth\", \"session\", \"gameplay\" },\n TtlSeconds = 900,\n MaxUses = 1000,\n BindToOrigin = \"https://app.example.com\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -62591,7 +72385,7 @@ } }, "403": { - "description": "Missing or invalid `x-api-key` (this endpoint answers `403`, never `401`, for a missing or invalid key), a scoped key without `transactions: write`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist. Also returned with `code: event_monitoring_disabled` while event ingestion is switched off for the application; nothing is stored in that case, and the check runs before the body is validated.", + "description": "A missing `x-api-key` (a wrong, revoked or expired key gets `401`), a scoped key without `transactions: write`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist. Also returned with `code: event_monitoring_disabled` while event ingestion is switched off for the application; nothing is stored in that case, and the check runs before the body is validated.", "content": { "application/json": { "examples": { @@ -62693,12 +72487,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nevent_uuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.get(\n f'https://verification.didit.me/v3/events/{event_uuid}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nevent = resp.json()\nprint(event['status'], event['score'])\nfor run in event['rule_runs']:\n print(run['rule_title'], run['score_delta'], run['action_summary'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.monitoring_events.retrieve(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const eventUuid = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/events/${eventUuid}/`, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst event = await resp.json();\nconsole.log(event.status, event.score, event.rule_runs.length, 'rule runs');" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.monitoringEvents.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.monitoringEvents().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "monitoringEvents->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.monitoring_events.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.MonitoringEvents.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -62857,7 +72676,7 @@ } }, "403": { - "description": "Missing or invalid `x-api-key` (this endpoint answers `403`, never `401`, for a missing or invalid key), a scoped key without `transactions: read`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist.", + "description": "A missing `x-api-key` (a wrong, revoked or expired key gets `401`), a scoped key without `transactions: read`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist.", "content": { "application/json": { "examples": { @@ -63237,12 +73056,37 @@ { "lang": "python", "label": "Python", - "source": "import os\nfrom urllib.parse import quote\n\nimport requests\n\nvendor_data = 'user-42'\nresp = requests.get(\n f'https://verification.didit.me/v3/events/subjects/{quote(vendor_data, safe=\"\")}/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'entity_type': 'individual', 'limit': 50},\n timeout=10,\n)\nresp.raise_for_status()\nfor event in resp.json()['results']:\n print(event['occurred_at'], event['event_category'], event['action_type'], event['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.monitoring_events.retrieve_subject_timeline(\n \"user-42\",\n):\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const vendorData = 'user-42';\nconst url = `https://verification.didit.me/v3/events/subjects/${encodeURIComponent(vendorData)}/?entity_type=individual&limit=50`;\nconst resp = await fetch(url, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst page = await resp.json();\nfor (const event of page.results) console.log(event.occurred_at, event.event_category, event.action_type, event.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.monitoringEvents.retrieveSubjectTimeline(\"user-42\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.MonitoringEvents.RetrieveSubjectTimelineAutoPaging(ctx, \"user-42\", didit.MonitoringEventsRetrieveSubjectTimelineParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.monitoringEvents().retrieveSubjectTimeline(\"user-42\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "monitoringEvents->retrieveSubjectTimeline('user-42') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.monitoring_events.retrieve_subject_timeline(\"user-42\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.MonitoringEvents.RetrieveSubjectTimelineAsync(\"user-42\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -63369,7 +73213,7 @@ } }, "403": { - "description": "Missing or invalid `x-api-key` (this endpoint answers `403`, never `401`, for a missing or invalid key), a scoped key without `transactions: read`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist.", + "description": "A missing `x-api-key` (a wrong, revoked or expired key gets `401`), a scoped key without `transactions: read`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist.", "content": { "application/json": { "examples": { @@ -63467,12 +73311,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nresp = requests.get(\n 'https://verification.didit.me/v3/events/enrichment-metrics/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'days': 30},\n timeout=10,\n)\nresp.raise_for_status()\nmetrics = resp.json()\nprint(metrics['events_ingested'], metrics['cache_hit_rate'], metrics['provider_calls_per_1k_events'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.monitoring_events.retrieve_enrichment_metrics()\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const resp = await fetch('https://verification.didit.me/v3/events/enrichment-metrics/?days=30', {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst metrics = await resp.json();\nconsole.log(metrics.events_ingested, metrics.cache_hit_rate, metrics.provider_calls_per_1k_events);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.monitoringEvents.retrieveEnrichmentMetrics();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.RetrieveEnrichmentMetrics(ctx, didit.MonitoringEventsRetrieveEnrichmentMetricsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.monitoringEvents().retrieveEnrichmentMetrics();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "monitoringEvents->retrieveEnrichmentMetrics();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.monitoring_events.retrieve_enrichment_metrics\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.MonitoringEvents.RetrieveEnrichmentMetricsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -63595,7 +73464,7 @@ } }, "403": { - "description": "Missing or invalid `x-api-key` (this endpoint answers `403`, never `401`, for a missing or invalid key), a scoped key without `transactions: read`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist.", + "description": "A missing `x-api-key` (a wrong, revoked or expired key gets `401`), a scoped key without `transactions: read`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist.", "content": { "application/json": { "examples": { @@ -63691,12 +73560,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nevent_uuid = '11111111-2222-3333-4444-555555555555'\nresp = requests.delete(\n f'https://verification.didit.me/v3/events/{event_uuid}/delete/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status() # 204 No Content\nprint('deleted', event_uuid)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.monitoring_events.delete(\n \"11111111-2222-3333-4444-555555555555\",\n)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const eventUuid = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/events/${eventUuid}/delete/`, {\n method: 'DELETE',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (resp.status !== 204) throw new Error(`Delete failed: ${resp.status}`);\nconsole.log('deleted', eventUuid);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.monitoringEvents.delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.MonitoringEvents.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.monitoringEvents().delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "monitoringEvents->delete('11111111-2222-3333-4444-555555555555');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.monitoring_events.delete(\"11111111-2222-3333-4444-555555555555\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.MonitoringEvents.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");" } ], "responses": { @@ -63718,7 +73612,7 @@ } }, "403": { - "description": "Missing or invalid `x-api-key` (this endpoint answers `403`, never `401`, for a missing or invalid key), a scoped key without `transactions: write`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist.", + "description": "A missing `x-api-key` (a wrong, revoked or expired key gets `401`), a scoped key without `transactions: write`, a key limited to some workflows or to approved sessions (such a key never reaches transaction monitoring data), or a request from outside the key's IP allowlist.", "content": { "application/json": { "examples": { @@ -63839,12 +73733,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nsession_id = '33333333-4444-5555-6666-777777777777'\nparty_uuid = '0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41'\nresp = requests.post(\n f'https://verification.didit.me/v3/session/{session_id}/kyb/parties/{party_uuid}/regenerate/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nparty = resp.json()\nprint(party['kyc_session_id'], party['kyc_session_status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.regenerate_kyb_party(\n \"33333333-4444-5555-6666-777777777777\",\n \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const sessionId = '33333333-4444-5555-6666-777777777777';\nconst partyUuid = '0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41';\nconst resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/kyb/parties/${partyUuid}/regenerate/`, {\n method: 'POST',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Regenerate failed: ${resp.status}`);\nconst party = await resp.json();\nconsole.log(party.kyc_session_id, party.kyc_session_status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.regenerateKybParty(\n \"33333333-4444-5555-6666-777777777777\",\n \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.RegenerateKYBParty(ctx, \"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().regenerateKybParty(\"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->regenerateKybParty('33333333-4444-5555-6666-777777777777', '0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.regenerate_kyb_party(\n \"33333333-4444-5555-6666-777777777777\",\n \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.RegenerateKybPartyAsync(\"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -63935,7 +73854,7 @@ } }, "403": { - "description": "Authentication or authorization failure. Missing, invalid and revoked keys return `403` (not `401`); so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist. Distinguish them by `detail`.", + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", "content": { "application/json": { "schema": { @@ -64151,12 +74070,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\ntransaction_id = 'abcdef12-3456-7890-abcd-ef1234567890'\nurl = f'https://verification.didit.me/v3/transactions/{transaction_id}/notes/'\nparams = {'limit': 50}\nwhile url:\n resp = requests.get(\n url,\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params=params,\n timeout=10,\n )\n resp.raise_for_status()\n page = resp.json()\n for note in page['results']:\n print(note['created_at'], note['actor_name'], note['note'])\n url, params = page['next'], None" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.transactions.notes.list(\n \"abcdef12-3456-7890-abcd-ef1234567890\",\n):\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const transactionId = 'abcdef12-3456-7890-abcd-ef1234567890';\nlet url = `https://verification.didit.me/v3/transactions/${transactionId}/notes/?limit=50`;\nwhile (url) {\n const resp = await fetch(url, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n });\n if (!resp.ok) throw new Error(`List notes failed: ${resp.status}`);\n const page = await resp.json();\n for (const note of page.results) console.log(note.created_at, note.actor_name, note.note);\n url = page.next;\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.transactions.notes.list(\"abcdef12-3456-7890-abcd-ef1234567890\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Transactions.Notes.ListAutoPaging(ctx, \"abcdef12-3456-7890-abcd-ef1234567890\", didit.TransactionsNotesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.transactions().notes().list(\"abcdef12-3456-7890-abcd-ef1234567890\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->notes->list('abcdef12-3456-7890-abcd-ef1234567890') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.notes.list(\"abcdef12-3456-7890-abcd-ef1234567890\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Transactions.Notes.ListAsync(\"abcdef12-3456-7890-abcd-ef1234567890\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -64304,7 +74248,7 @@ } }, "403": { - "description": "The request is not allowed. A missing or invalid API key gets the generic message (never `401`).", + "description": "The request is not allowed. A missing key gets the generic message; a wrong, revoked or expired key gets `401`.", "content": { "application/json": { "schema": { @@ -64497,12 +74441,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\ntransaction_id = 'abcdef12-3456-7890-abcd-ef1234567890'\nresp = requests.post(\n f'https://verification.didit.me/v3/transactions/{transaction_id}/notes/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={\n 'note': 'Customer confirmed the withdrawal by phone.',\n 'mentioned_emails': ['analyst@example.com'],\n },\n timeout=10,\n)\nresp.raise_for_status()\nnote = resp.json()\nprint(note['uuid'], note['created_at'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.notes.create(\n \"abcdef12-3456-7890-abcd-ef1234567890\",\n note=\"Customer confirmed the withdrawal by phone.\",\n mentioned_emails=[\"analyst@example.com\"],\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const transactionId = 'abcdef12-3456-7890-abcd-ef1234567890';\nconst resp = await fetch(`https://verification.didit.me/v3/transactions/${transactionId}/notes/`, {\n method: 'POST',\n headers: {\n 'x-api-key': process.env.DIDIT_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n note: 'Customer confirmed the withdrawal by phone.',\n mentioned_emails: ['analyst@example.com'],\n }),\n});\nif (!resp.ok) throw new Error(`Create note failed: ${resp.status}`);\nconst note = await resp.json();\nconsole.log(note.uuid, note.created_at);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.notes.create(\"abcdef12-3456-7890-abcd-ef1234567890\", {\n note: \"Customer confirmed the withdrawal by phone.\",\n mentioned_emails: [\"analyst@example.com\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Notes.Create(ctx, \"abcdef12-3456-7890-abcd-ef1234567890\", didit.TransactionsNotesCreateParams{\n\tNote: \"Customer confirmed the withdrawal by phone.\",\n\tMentionedEmails: didit.Some([]string{\"analyst@example.com\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.TransactionsNotesCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().notes().create(\"abcdef12-3456-7890-abcd-ef1234567890\", TransactionsNotesCreateParams.builder()\n .note(\"Customer confirmed the withdrawal by phone.\")\n .mentionedEmails(List.of(\"analyst@example.com\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->notes->create('abcdef12-3456-7890-abcd-ef1234567890', [\n 'note' => 'Customer confirmed the withdrawal by phone.',\n 'mentioned_emails' => ['analyst@example.com'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.notes.create(\n \"abcdef12-3456-7890-abcd-ef1234567890\",\n note: \"Customer confirmed the withdrawal by phone.\",\n mentioned_emails: [\"analyst@example.com\"]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Notes.CreateAsync(\"abcdef12-3456-7890-abcd-ef1234567890\", new TransactionsNotesCreateParams\n{\n Note = \"Customer confirmed the withdrawal by phone.\",\n MentionedEmails = new string[] { \"analyst@example.com\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -64599,7 +74568,7 @@ } }, "403": { - "description": "The request is not allowed. A missing or invalid API key gets the generic message (never `401`).", + "description": "The request is not allowed. A missing key gets the generic message; a wrong, revoked or expired key gets `401`.", "content": { "application/json": { "schema": { @@ -64774,12 +74743,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\ntransaction_id = 'abcdef12-3456-7890-abcd-ef1234567890'\nresp = requests.get(\n f'https://verification.didit.me/v3/transactions/{transaction_id}/related/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'limit': 50},\n timeout=10,\n)\nresp.raise_for_status()\nfor tx in resp.json()['results']:\n print(tx['uuid'], tx['txn_date'], tx['status'], tx['amount'], tx['currency'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.transactions.list_related(\n \"abcdef12-3456-7890-abcd-ef1234567890\",\n):\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const transactionId = 'abcdef12-3456-7890-abcd-ef1234567890';\nconst resp = await fetch(\n `https://verification.didit.me/v3/transactions/${transactionId}/related/?limit=50`,\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n);\nif (!resp.ok) throw new Error(`Related lookup failed: ${resp.status}`);\nconst page = await resp.json();\nfor (const tx of page.results) console.log(tx.uuid, tx.status, tx.amount, tx.currency);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.transactions.listRelated(\"abcdef12-3456-7890-abcd-ef1234567890\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Transactions.ListRelatedAutoPaging(ctx, \"abcdef12-3456-7890-abcd-ef1234567890\", didit.TransactionsListRelatedParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.transactions().listRelated(\"abcdef12-3456-7890-abcd-ef1234567890\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->listRelated('abcdef12-3456-7890-abcd-ef1234567890') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.list_related(\"abcdef12-3456-7890-abcd-ef1234567890\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Transactions.ListRelatedAsync(\"abcdef12-3456-7890-abcd-ef1234567890\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -64927,7 +74921,7 @@ } }, "403": { - "description": "The request is not allowed. A missing or invalid API key gets the generic message (never `401`).", + "description": "The request is not allowed. A missing key gets the generic message; a wrong, revoked or expired key gets `401`.", "content": { "application/json": { "schema": { @@ -65101,12 +75095,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\norg_id = '11111111-2222-3333-4444-555555555555'\napp_id = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'\nbusiness_session_id = '22222222-3333-4444-5555-666666666666'\nresp = requests.get(\n f'https://verification.didit.me/v3/organization/{org_id}/application/{app_id}'\n f'/businesses/{business_session_id}/pdf/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=60,\n)\nresp.raise_for_status()\nwith open(f'business_{business_session_id}.pdf', 'wb') as fh:\n fh.write(resp.content)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\ncontent = client.businesses.generate_session_pdf(\n \"22222222-3333-4444-5555-666666666666\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n file.write(content)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import { writeFile } from 'node:fs/promises';\n\nconst orgId = '11111111-2222-3333-4444-555555555555';\nconst appId = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee';\nconst businessSessionId = '22222222-3333-4444-5555-666666666666';\nconst resp = await fetch(\n `https://verification.didit.me/v3/organization/${orgId}/application/${appId}/businesses/${businessSessionId}/pdf/`,\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n);\nif (!resp.ok) throw new Error(`PDF generation failed: ${resp.status}`);\nawait writeFile(`business_${businessSessionId}.pdf`, Buffer.from(await resp.arrayBuffer()));" + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst content = await didit.businesses.generateSessionPdf(\"22222222-3333-4444-5555-666666666666\");\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresp, err := client.Businesses.GenerateSessionPDF(ctx, \"22222222-3333-4444-5555-666666666666\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.businesses().generateSessionPdf(\"22222222-3333-4444-5555-666666666666\")\n .writeTo(Path.of(\"download.pdf\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "businesses->generateSessionPdf('22222222-3333-4444-5555-666666666666');\n$content->saveTo('download.pdf');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ncontent = didit.businesses.generate_session_pdf(\"22222222-3333-4444-5555-666666666666\")\nFile.binwrite(\"download.pdf\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar content = await client.Businesses.GenerateSessionPdfAsync(\"22222222-3333-4444-5555-666666666666\");\nawait content.SaveToAsync(\"download.pdf\");" } ], "responses": { @@ -65153,7 +75172,7 @@ } }, "403": { - "description": "The request is not allowed or the session is not finished. Read `detail`: a session that is not `Approved`, `Declined` or `In Review`, a missing or invalid API key (never `401`), an `application_id` that is not the key's application, a scoped key without `media: read` or `businesses: read`, a key limited to workflows or approved sessions, or a request from outside the key's IP list.", + "description": "The request is not allowed or the session is not finished. Read `detail`: a session that is not `Approved`, `Declined` or `In Review`, a missing API key (a wrong, revoked or expired key gets `401`), an `application_id` that is not the key's application, a scoped key without `media: read` or `businesses: read`, a key limited to workflows or approved sessions, or a request from outside the key's IP list.", "content": { "application/json": { "schema": { @@ -65342,12 +75361,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\norg_id = '11111111-2222-3333-4444-555555555555'\napp_id = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'\ntransaction_uuid = 'abcdef12-3456-7890-abcd-ef1234567890'\nresp = requests.get(\n f'https://verification.didit.me/v3/organization/{org_id}/application/{app_id}'\n f'/transactions/{transaction_uuid}/pdf/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=60,\n)\nresp.raise_for_status()\nwith open(f'transaction_{transaction_uuid}.pdf', 'wb') as fh:\n fh.write(resp.content)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\ncontent = client.transactions.generate_pdf(\n \"abcdef12-3456-7890-abcd-ef1234567890\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n file.write(content)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import { writeFile } from 'node:fs/promises';\n\nconst orgId = '11111111-2222-3333-4444-555555555555';\nconst appId = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee';\nconst transactionUuid = 'abcdef12-3456-7890-abcd-ef1234567890';\nconst resp = await fetch(\n `https://verification.didit.me/v3/organization/${orgId}/application/${appId}/transactions/${transactionUuid}/pdf/`,\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n);\nif (!resp.ok) throw new Error(`PDF generation failed: ${resp.status}`);\nawait writeFile(`transaction_${transactionUuid}.pdf`, Buffer.from(await resp.arrayBuffer()));" + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst content = await didit.transactions.generatePdf(\"abcdef12-3456-7890-abcd-ef1234567890\");\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresp, err := client.Transactions.GeneratePDF(ctx, \"abcdef12-3456-7890-abcd-ef1234567890\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.transactions().generatePdf(\"abcdef12-3456-7890-abcd-ef1234567890\")\n .writeTo(Path.of(\"download.pdf\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->generatePdf('abcdef12-3456-7890-abcd-ef1234567890');\n$content->saveTo('download.pdf');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ncontent = didit.transactions.generate_pdf(\"abcdef12-3456-7890-abcd-ef1234567890\")\nFile.binwrite(\"download.pdf\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar content = await client.Transactions.GeneratePdfAsync(\"abcdef12-3456-7890-abcd-ef1234567890\");\nawait content.SaveToAsync(\"download.pdf\");" } ], "responses": { @@ -65394,7 +75438,7 @@ } }, "403": { - "description": "The request is not allowed. Read `detail`: a missing or invalid API key (never `401`), an `application_id` that is not the key's application, a scoped key without `media: read` or `transactions: read`, a key limited to workflows or approved sessions, or a request from outside the key's IP list.", + "description": "The request is not allowed. Read `detail`: a missing API key (a wrong, revoked or expired key gets `401`), an `application_id` that is not the key's application, a scoped key without `media: read` or `transactions: read`, a key limited to workflows or approved sessions, or a request from outside the key's IP list.", "content": { "application/json": { "schema": { @@ -65673,12 +75717,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\norg_id = '11111111-2222-3333-4444-555555555555'\napp_id = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'\nresp = requests.get(\n f'https://verification.didit.me/v3/organization/{org_id}/application/{app_id}/analytics/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'start_date': '2026-10-01', 'end_date': '2026-10-15'},\n timeout=10,\n)\nresp.raise_for_status()\ndata = resp.json()\nprint(data['request_breakdown']['total_approved'], data['conversion_rate'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.analytics.retrieve()\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const orgId = '11111111-2222-3333-4444-555555555555';\nconst appId = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee';\nconst params = new URLSearchParams({ start_date: '2026-10-01', end_date: '2026-10-15' });\nconst resp = await fetch(\n `https://verification.didit.me/v3/organization/${orgId}/application/${appId}/analytics/?${params}`,\n { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },\n);\nif (!resp.ok) throw new Error(`Analytics failed: ${resp.status}`);\nconst data = await resp.json();\nconsole.log(data.request_breakdown.total_approved, data.conversion_rate);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.analytics.retrieve();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Analytics.Retrieve(ctx, didit.AnalyticsRetrieveParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.analytics().retrieve();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "analytics->retrieve();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.analytics.retrieve\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Analytics.RetrieveAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -66185,6 +76254,277 @@ } } }, + "403": { + "description": "The request is not allowed. Read `detail`: a missing API key (a wrong, revoked or expired key gets `401`), a key of another application, any scoped key, or a request from outside the key's IP list.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string" + } + } + }, + "examples": { + "Missing or invalid key": { + "value": { + "detail": "Authentication credentials were not provided or are invalid." + } + }, + "Another application": { + "value": { + "detail": "You do not have permission to perform this action." + } + }, + "Scoped key": { + "value": { + "detail": "This API key has no access to this endpoint." + } + }, + "Outside the key's IP list": { + "value": { + "detail": "This API key can't be used from this IP address." + } + } + } + } + } + }, + "429": { + "description": "More than 600 GET requests per minute with this API key. Wait the number of seconds in `Retry-After`, then retry.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string" + } + } + }, + "examples": { + "Throttled": { + "value": { + "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute." + } + } + } + } + }, + "headers": { + "Retry-After": { + "description": "Seconds until the current one-minute window resets.", + "schema": { + "type": "integer", + "example": 23 + } + }, + "X-RateLimit-Limit": { + "description": "Requests allowed per minute in this budget.", + "schema": { + "type": "integer" + } + }, + "X-RateLimit-Remaining": { + "description": "Requests left in the current window.", + "schema": { + "type": "integer" + } + }, + "X-RateLimit-Reset": { + "description": "Unix time when the window resets.", + "schema": { + "type": "integer" + } + } + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ] + } + }, + "/v3/organization/{organization_id}/application/{application_id}/analytics/today/": { + "get": { + "summary": "Get today's verifications by hour", + "operationId": "get_application_analytics_today", + "x-didit-sdk": { + "resource": "analytics", + "method": "retrieve_today", + "auth": "api_key", + "server": true, + "scope": "application" + }, + "tags": [ + "Analytics" + ], + "description": "Today's user verification (KYC) sessions, from local midnight in `tz`, counted per local hour they were created in, next to the same hours of the same weekday one week before, and split by the outcome each one holds now: approved, in review or declined. This is the volume card of the Business Console's Home.\n\n`total` is today so far. `previous_total_so_far` counts the comparison day only up to the same local time, so a change between them compares the same part of both days. The hours still to come today are `0`. A day on which the clocks change has 23 or 25 hours: the missing hour stays `0` and the repeated hour holds both.", + "parameters": [ + { + "name": "organization_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "Organization UUID.", + "example": "11111111-2222-3333-4444-555555555555" + }, + { + "name": "application_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "Application UUID. Must be the application the API key belongs to: a key used on any other application gets `403`.", + "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" + }, + { + "name": "tz", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "UTC", + "example": "Europe/Madrid" + }, + "description": "IANA time zone whose midnight starts today, for example `Europe/Madrid` or `America/Mexico_City`. Omit it for UTC." + } + ], + "responses": { + "200": { + "description": "Today's verifications by local hour, the comparison day's, and today's outcomes.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApplicationAnalyticsToday" + }, + "examples": { + "Madrid, 14:00": { + "value": { + "time_zone": "Europe/Madrid", + "date": "2026-10-30", + "current_hour": 14, + "previous_date": "2026-10-23", + "hours": [ + 3, + 1, + 0, + 0, + 1, + 2, + 4, + 9, + 14, + 18, + 21, + 19, + 22, + 24, + 27, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "previous_hours": [ + 2, + 1, + 1, + 0, + 1, + 3, + 5, + 8, + 12, + 16, + 19, + 18, + 20, + 22, + 24, + 26, + 23, + 19, + 15, + 12, + 9, + 7, + 5, + 3 + ], + "total": 165, + "previous_total_so_far": 151, + "outcomes": { + "approved": 139, + "in_review": 6, + "declined": 18 + } + } + } + } + } + } + }, + "400": { + "description": "Unknown time zone. The body is keyed by the parameter, with a list of messages.", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "examples": { + "Unknown time zone": { + "value": { + "tz": [ + "Unknown time zone: Europe/Atlantis." + ] + } + } + } + } + } + }, + "401": { + "description": "The API key has expired. Only a key created with an expiry date can expire; after that date every request with it answers `401`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string" + } + } + }, + "examples": { + "Expired key": { + "value": { + "detail": "This API key has expired." + } + } + } + } + } + }, "403": { "description": "The request is not allowed. Read `detail`: a missing or invalid API key (never `401`), a key of another application, any scoped key, or a request from outside the key's IP list.", "content": { @@ -66272,6 +76612,13 @@ } } }, + "x-codeSamples": [ + { + "lang": "curl", + "label": "curl", + "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/analytics/today/?tz=Europe%2FMadrid' \\\n -H 'x-api-key: YOUR_API_KEY'" + } + ], "security": [ { "ApiKeyAuth": [] @@ -66315,12 +76662,37 @@ { "lang": "python", "label": "Python", - "source": "import json\nimport os\n\nimport requests\n\nsession_id = '22222222-3333-4444-5555-666666666666'\nresp = requests.get(\n f'https://verification.didit.me/v3/session/{session_id}/webhooks/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nfor delivery in resp.json():\n payload = json.loads(delivery['request_body'])\n print(delivery['created_at'], delivery['webhook_type'], delivery['response_status'], payload['event_id'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.webhooks.list(\n \"22222222-3333-4444-5555-666666666666\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const sessionId = '22222222-3333-4444-5555-666666666666';\nconst resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/webhooks/`, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst deliveries = await resp.json();\nfor (const delivery of deliveries) {\n const payload = JSON.parse(delivery.request_body);\n console.log(delivery.created_at, delivery.webhook_type, delivery.response_status, payload.event_id);\n}" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.webhooks.list(\"22222222-3333-4444-5555-666666666666\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Webhooks.List(ctx, \"22222222-3333-4444-5555-666666666666\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().webhooks().list(\"22222222-3333-4444-5555-666666666666\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->webhooks->list('22222222-3333-4444-5555-666666666666');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.webhooks.list(\"22222222-3333-4444-5555-666666666666\").each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Webhooks.ListAsync(\"22222222-3333-4444-5555-666666666666\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -66369,7 +76741,7 @@ } }, "401": { - "description": "The API key has expired: it was created with an expiry date that has passed. A missing, invalid or revoked key gets `403`, not `401`.", + "description": "The API key has expired: it was created with an expiry date that has passed. A wrong or revoked key also gets `401`; a missing key gets `403`.", "content": { "application/json": { "schema": { @@ -66578,12 +76950,37 @@ { "lang": "python", "label": "Python", - "source": "import json\nimport os\n\nimport requests\n\nsession_id = '22222222-3333-4444-5555-666666666666'\nwebhook_uuid = '66666666-7777-8888-9999-000000000001'\nresp = requests.get(\n f'https://verification.didit.me/v3/session/{session_id}/webhook/{webhook_uuid}', # no trailing slash\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\ndelivery = resp.json()\nheaders = json.loads(delivery['request_header'])\npayload = json.loads(delivery['request_body'])\nprint(delivery['response_status'], headers['X-Signature-V2'], payload['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.webhooks.retrieve(\n \"22222222-3333-4444-5555-666666666666\",\n \"66666666-7777-8888-9999-000000000001\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const sessionId = '22222222-3333-4444-5555-666666666666';\nconst webhookUuid = '66666666-7777-8888-9999-000000000001';\n// No trailing slash on this path.\nconst resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/webhook/${webhookUuid}`, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst delivery = await resp.json();\nconst payload = JSON.parse(delivery.request_body);\nconsole.log(delivery.response_status, payload.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.webhooks.retrieve(\n \"22222222-3333-4444-5555-666666666666\",\n \"66666666-7777-8888-9999-000000000001\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Webhooks.Retrieve(ctx, \"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().webhooks().retrieve(\"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->webhooks->retrieve('22222222-3333-4444-5555-666666666666', '66666666-7777-8888-9999-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.webhooks.retrieve(\n \"22222222-3333-4444-5555-666666666666\",\n \"66666666-7777-8888-9999-000000000001\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Webhooks.RetrieveAsync(\"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -66613,7 +77010,7 @@ } }, "401": { - "description": "The API key has expired: it was created with an expiry date that has passed. A missing, invalid or revoked key gets `403`, not `401`.", + "description": "The API key has expired: it was created with an expiry date that has passed. A wrong or revoked key also gets `401`; a missing key gets `403`.", "content": { "application/json": { "schema": { @@ -66827,12 +77224,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nsession_id = '22222222-3333-4444-5555-666666666666'\nwebhook_uuid = '66666666-7777-8888-9999-000000000001'\nresp = requests.post(\n f'https://verification.didit.me/v3/session/{session_id}/webhook/{webhook_uuid}/resend', # no trailing slash\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nresent = resp.json()\nprint(resent['uuid'], resent['response_status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.webhooks.resend(\n \"22222222-3333-4444-5555-666666666666\",\n \"66666666-7777-8888-9999-000000000001\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const sessionId = '22222222-3333-4444-5555-666666666666';\nconst webhookUuid = '66666666-7777-8888-9999-000000000001';\n// No trailing slash on this path.\nconst resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/webhook/${webhookUuid}/resend`, {\n method: 'POST',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(await resp.text());\nconst resent = await resp.json();\nconsole.log(resent.uuid, resent.response_status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.webhooks.resend(\n \"22222222-3333-4444-5555-666666666666\",\n \"66666666-7777-8888-9999-000000000001\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Webhooks.Resend(ctx, \"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().webhooks().resend(\"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->webhooks->resend('22222222-3333-4444-5555-666666666666', '66666666-7777-8888-9999-000000000001');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.webhooks.resend(\n \"22222222-3333-4444-5555-666666666666\",\n \"66666666-7777-8888-9999-000000000001\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Webhooks.ResendAsync(\"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -66896,7 +77318,7 @@ } }, "401": { - "description": "The API key has expired: it was created with an expiry date that has passed. A missing, invalid or revoked key gets `403`, not `401`.", + "description": "The API key has expired: it was created with an expiry date that has passed. A wrong or revoked key also gets `401`; a missing key gets `403`.", "content": { "application/json": { "schema": { @@ -67135,12 +77557,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nsession_id = '11111111-2222-3333-4444-555555555555'\nresp = requests.get(\n f'https://verification.didit.me/v3/session/{session_id}/events/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n params={'limit': 50},\n timeout=10,\n)\nresp.raise_for_status()\nfor event in resp.json()['results']:\n print(event['sent_at'], event['event_type'], event['step'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.sessions.list_events(\n \"11111111-2222-3333-4444-555555555555\",\n):\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const sessionId = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/events/?limit=50`, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst page = await resp.json();\nfor (const event of page.results) console.log(event.sent_at, event.event_type, event.step);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.sessions.listEvents(\"11111111-2222-3333-4444-555555555555\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.ListEventsAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsListEventsParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.sessions().listEvents(\"11111111-2222-3333-4444-555555555555\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->listEvents('11111111-2222-3333-4444-555555555555') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.list_events(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Sessions.ListEventsAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -67297,7 +77744,7 @@ } }, "403": { - "description": "Authentication or authorization failure. Missing, invalid and revoked keys return `403` (not `401`); so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist. Distinguish them by `detail`.", + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", "content": { "application/json": { "schema": { @@ -67419,7 +77866,7 @@ "/v3/session/{sessionId}/aml-screening-history/": { "get": { "summary": "List AML screening history", - "description": "List every completed ongoing-monitoring re-screen of a session's AML check, newest first by `completed_at`, including the runs where nothing changed: alerts, activity entries and webhooks fire only when a result moves, so this history is the evidence that a clean subject was still being screened. Works for KYC and KYB session IDs; pass `node_id` when the session ran more than one AML step. Only ongoing-monitoring re-screens are listed (the first screening is part of the session decision) and runs from before this history existed are not reconstructed, so a session without ongoing monitoring returns an empty list. `count` is exact up to 100 and capped at 100 above that, so follow `next` until it is `null`. A scoped API key needs `decisions: read`; see [Continuous AML monitoring](https://docs.didit.me/core-technology/aml-screening/continuous-monitoring-aml-screening).", + "description": "List every completed ongoing-monitoring re-screen of a session's AML check, newest first by `completed_at`, including the runs where nothing changed: alerts, activity entries and webhooks fire only when a result moves, so this history is the evidence that a clean subject was still being screened. Works for KYC and KYB session IDs; pass `node_id` when the session ran more than one AML step. Only ongoing-monitoring re-screens are listed (the first screening is part of the session decision) and runs from before this history existed are not reconstructed, so a session without ongoing monitoring returns an empty list. `count` is exact up to 100 and capped at 100 above that, so follow `next` until it is `null`. Pass `month` to read one calendar month at a time. A scoped API key needs `decisions: read`; see [Continuous AML monitoring](https://docs.didit.me/core-technology/aml-screening/continuous-monitoring-aml-screening).", "operationId": "get_v3_session_aml_screening_history", "x-didit-sdk": { "resource": "sessions", @@ -67452,6 +77899,17 @@ "example": "feature_aml_1" } }, + { + "name": "month", + "in": "query", + "required": false, + "description": "A UTC calendar month as `YYYY-MM`. Only screenings completed in that month are returned; without it every month is returned. A malformed month returns `400`.", + "schema": { + "type": "string", + "pattern": "^\\d{4}-(0[1-9]|1[0-2])$", + "example": "2026-09" + } + }, { "name": "limit", "in": "query", @@ -67498,12 +77956,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nsession_id = '11111111-2222-3333-4444-555555555555'\nresp = requests.get(\n f'https://verification.didit.me/v3/session/{session_id}/aml-screening-history/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nfor run in resp.json()['results']:\n print(run['completed_at'], run['outcome'], run['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.sessions.list_aml_screening_history(\n \"11111111-2222-3333-4444-555555555555\",\n):\n print(item)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const sessionId = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/aml-screening-history/`, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Request failed: ${resp.status}`);\nconst page = await resp.json();\nfor (const run of page.results) console.log(run.completed_at, run.outcome, run.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.sessions.listAmlScreeningHistory(\"11111111-2222-3333-4444-555555555555\")) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.ListAMLScreeningHistoryAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsListAMLScreeningHistoryParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.sessions().listAmlScreeningHistory(\"11111111-2222-3333-4444-555555555555\")) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->listAmlScreeningHistory('11111111-2222-3333-4444-555555555555') as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.list_aml_screening_history(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Sessions.ListAmlScreeningHistoryAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -67554,6 +78037,7 @@ "results": [ { "uuid": "dddddddd-1111-2222-3333-444444444444", + "run_id": "aaaaaaaa-1111-2222-3333-444444444444", "completed_at": "2026-09-14T04:12:33.481207Z", "started_at": "2026-09-14T04:00:01.002311Z", "outcome": "NO_CHANGE", @@ -67562,6 +78046,8 @@ "status": "Approved", "score": 0.0, "total_hits": 0, + "new_hits": 0, + "entities_screened": 1, "dataset_freshness": { "captured_at": "2026-09-14T03:58:02.114820+00:00", "provider": "aml_data_source", @@ -67590,6 +78076,7 @@ }, { "uuid": "eeeeeeee-1111-2222-3333-444444444444", + "run_id": "bbbbbbbb-1111-2222-3333-444444444444", "completed_at": "2026-09-13T04:11:58.020914Z", "started_at": "2026-09-13T04:00:00.871022Z", "outcome": "FAILED", @@ -67598,6 +78085,8 @@ "status": "Approved", "score": 0.0, "total_hits": 0, + "new_hits": null, + "entities_screened": 0, "dataset_freshness": null } ] @@ -67608,7 +78097,7 @@ } }, "400": { - "description": "`limit` or `offset` is above 1,000,000. The body is a JSON array with one message.", + "description": "`limit` or `offset` is above 1,000,000 (a JSON array with one message), or `month` is not a `YYYY-MM` calendar month (an object keyed by `month`).", "content": { "application/json": { "examples": { @@ -67623,13 +78112,36 @@ "value": [ "offset must not exceed 1000000." ] + }, + "Malformed month": { + "summary": "month=2026-13", + "value": { + "month": [ + "Not a calendar month. Use YYYY-MM." + ] + } } }, "schema": { - "type": "array", - "items": { - "type": "string" - } + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "object", + "properties": { + "month": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + ] } } } @@ -67659,7 +78171,7 @@ } }, "403": { - "description": "Authentication or authorization failure. Missing, invalid and revoked keys return `403` (not `401`); so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist. Distinguish them by `detail`.", + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", "content": { "application/json": { "schema": { @@ -67787,7 +78299,7 @@ "/v3/session/{sessionId}/aml-screening-history/export/": { "get": { "summary": "Export AML screening history as CSV", - "description": "Download the same ongoing-monitoring history as `GET /v3/session/{sessionId}/aml-screening-history/` as a CSV file, one line per completed re-screen, newest first, ready to hand to an auditor. The file is streamed whole (no pagination) and starts with a header line; an empty cell means unknown, dataset dates are never estimated, and a value that would start a spreadsheet formula is prefixed with an apostrophe. Works for KYC and KYB session IDs; pass `node_id` when the session ran more than one AML step. Errors are returned as JSON, not CSV. A scoped API key needs `decisions: read` and `media: read`: the response is a file, so a key without `media: read` gets `403`.", + "description": "Download the same ongoing-monitoring history as `GET /v3/session/{sessionId}/aml-screening-history/` as a CSV file, one line per completed re-screen, newest first, ready to hand to an auditor. The file is streamed whole (no pagination) and starts with a header line; an empty cell means unknown, dataset dates are never estimated, and a value that would start a spreadsheet formula is prefixed with an apostrophe. Works for KYC and KYB session IDs; pass `node_id` when the session ran more than one AML step. Pass `month` to export one calendar month. Errors are returned as JSON, not CSV. A scoped API key needs `decisions: read` and `media: read`: the response is a file, so a key without `media: read` gets `403`.", "operationId": "get_v3_session_aml_screening_history_export", "x-didit-sdk": { "resource": "sessions", @@ -67819,6 +78331,17 @@ "type": "string", "example": "feature_aml_1" } + }, + { + "name": "month", + "in": "query", + "required": false, + "description": "A UTC calendar month as `YYYY-MM`. Only screenings completed in that month are returned; without it every month is returned. A malformed month returns `400`.", + "schema": { + "type": "string", + "pattern": "^\\d{4}-(0[1-9]|1[0-2])$", + "example": "2026-09" + } } ], "x-codeSamples": [ @@ -67830,20 +78353,45 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nsession_id = '11111111-2222-3333-4444-555555555555'\nresp = requests.get(\n f'https://verification.didit.me/v3/session/{session_id}/aml-screening-history/export/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n timeout=10,\n)\nresp.raise_for_status()\nwith open('aml-screening-history.csv', 'wb') as fh:\n fh.write(resp.content)" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.export_aml_screening_history(\n \"11111111-2222-3333-4444-555555555555\",\n)\nwith open(\"download.csv\", \"wb\") as file:\n file.write(content)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import { writeFile } from 'node:fs/promises';\n\nconst sessionId = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/aml-screening-history/export/`, {\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n});\nif (!resp.ok) throw new Error(`Export failed: ${resp.status}`);\nawait writeFile('aml-screening-history.csv', await resp.text());" + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.exportAmlScreeningHistory(\"11111111-2222-3333-4444-555555555555\");\nawait writeFile(\"download.csv\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.ExportAMLScreeningHistory(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsExportAMLScreeningHistoryParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.csv\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().exportAmlScreeningHistory(\"11111111-2222-3333-4444-555555555555\")\n .writeTo(Path.of(\"download.csv\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->exportAmlScreeningHistory('11111111-2222-3333-4444-555555555555');\n$content->saveTo('download.csv');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.export_aml_screening_history(\"11111111-2222-3333-4444-555555555555\")\nFile.binwrite(\"download.csv\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.ExportAmlScreeningHistoryAsync(\"11111111-2222-3333-4444-555555555555\");\nawait content.SaveToAsync(\"download.csv\");" } ], "responses": { "200": { - "description": "The CSV file, streamed as `text/csv` with CRLF line endings. Columns, in order: `screened_at` (when the re-screen finished), `outcome` (`NO_CHANGE`, `CHANGED` or `FAILED`), `provider` (opaque identifier of the AML data source; do not branch on it), `aml_status`, `aml_score`, `total_hits`, `datasets_captured_at`, `datasets_sanctions_last_updated_at`, `datasets_pep_last_updated_at`, `datasets_warnings_last_updated_at`, `datasets_adverse_media_last_updated_at` and `datasets_catalog_version`. Dates are ISO 8601 with a UTC offset. A session with no re-screens yet returns the header line only.", + "description": "The CSV file, streamed as `text/csv` with CRLF line endings. Columns, in order: `screened_at` (when the re-screen finished), `outcome` (`NO_CHANGE`, `CHANGED` or `FAILED`), `provider` (opaque identifier of the AML data source; do not branch on it), `aml_status`, `aml_score`, `total_hits`, `datasets_captured_at`, `datasets_sanctions_last_updated_at`, `datasets_pep_last_updated_at`, `datasets_warnings_last_updated_at`, `datasets_adverse_media_last_updated_at`, `datasets_catalog_version`, `run_id` (the monitoring run), `entities_screened` (`1`, or `0` for a failed run) and `new_hits` (empty when unknown). Dates are ISO 8601 with a UTC offset. A session with no re-screens yet returns the header line only.", "headers": { "Content-Disposition": { - "description": "`attachment; filename=\"aml-screening-history-{sessionId}.csv\"`.", + "description": "`attachment; filename=\"aml-screening-history-{sessionId}.csv\"`, or `aml-screening-history-{sessionId}-{month}.csv` when `month` is passed.", "schema": { "type": "string", "example": "attachment; filename=\"aml-screening-history-11111111-2222-3333-4444-555555555555.csv\"" @@ -67856,7 +78404,35 @@ "type": "string", "format": "binary" }, - "example": "screened_at,outcome,provider,aml_status,aml_score,total_hits,datasets_captured_at,datasets_sanctions_last_updated_at,datasets_pep_last_updated_at,datasets_warnings_last_updated_at,datasets_adverse_media_last_updated_at,datasets_catalog_version\r\n2026-09-14T04:12:33.481207+00:00,NO_CHANGE,aml_data_source,Approved,0.0,0,2026-09-14T03:58:02.114820+00:00,2026-09-13T21:10:00+00:00,2026-09-13T08:00:00+00:00,2026-09-12T18:45:00+00:00,,2026-09-13\r\n2026-09-13T04:11:58.020914+00:00,FAILED,aml_data_source,Approved,0.0,0,,,,,,\r\n" + "example": "screened_at,outcome,provider,aml_status,aml_score,total_hits,datasets_captured_at,datasets_sanctions_last_updated_at,datasets_pep_last_updated_at,datasets_warnings_last_updated_at,datasets_adverse_media_last_updated_at,datasets_catalog_version,run_id,entities_screened,new_hits\r\n2026-09-14T04:12:33.481207+00:00,NO_CHANGE,aml_data_source,Approved,0.0,0,2026-09-14T03:58:02.114820+00:00,2026-09-13T21:10:00+00:00,2026-09-13T08:00:00+00:00,2026-09-12T18:45:00+00:00,,2026-09-13,aaaaaaaa-1111-2222-3333-444444444444,1,0\r\n2026-09-13T04:11:58.020914+00:00,FAILED,aml_data_source,Approved,0.0,0,,,,,,,bbbbbbbb-1111-2222-3333-444444444444,0,\r\n" + } + } + }, + "400": { + "description": "`month` is not a `YYYY-MM` calendar month.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "month": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "examples": { + "Malformed month": { + "summary": "month=2026-13", + "value": { + "month": [ + "Not a calendar month. Use YYYY-MM." + ] + } + } + } } } }, @@ -67885,7 +78461,7 @@ } }, "403": { - "description": "Authentication or authorization failure. Missing, invalid and revoked keys return `403` (not `401`); so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist. Distinguish them by `detail`.", + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", "content": { "application/json": { "schema": { @@ -68090,12 +78666,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nsession_id = '11111111-2222-3333-4444-555555555555'\nwith open('back-of-id.jpg', 'rb') as fh:\n resp = requests.patch(\n f'https://verification.didit.me/v3/session/{session_id}/add-images/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n files={'file': ('back-of-id.jpg', fh, 'image/jpeg')},\n data={'model_type': 'kyc'},\n timeout=10,\n )\nresp.raise_for_status()\nprint(resp.json()['extra_files'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.add_images(\n \"11111111-2222-3333-4444-555555555555\",\n file=open(\"image.jpg\", \"rb\"),\n model_type=\"kyc\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "import { readFile } from 'node:fs/promises';\n\nconst sessionId = '11111111-2222-3333-4444-555555555555';\nconst form = new FormData();\nform.append('file', new Blob([await readFile('./back-of-id.jpg')], { type: 'image/jpeg' }), 'back-of-id.jpg');\nform.append('model_type', 'kyc');\n\nconst resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/add-images/`, {\n method: 'PATCH',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY },\n body: form,\n});\nif (!resp.ok) throw new Error(`Upload failed: ${resp.status}`);\nconst { extra_files: extraFiles } = await resp.json();\nconsole.log(extraFiles);" + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.addImages(\"11111111-2222-3333-4444-555555555555\", {\n file: await fileFromPath(\"image.jpg\"),\n model_type: \"kyc\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.AddImages(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsAddImagesParams{\n\tFile: didit.FileFromPath(\"image.jpg\"),\n\tModelType: \"kyc\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.SessionsAddImagesParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().addImages(\"11111111-2222-3333-4444-555555555555\", SessionsAddImagesParams.builder()\n .file(Path.of(\"image.jpg\"))\n .modelType(SessionsAddImagesParams.ModelType.of(\"kyc\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->addImages('11111111-2222-3333-4444-555555555555', [\n 'file' => File::fromPath('image.jpg'),\n 'model_type' => 'kyc',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.add_images(\n \"11111111-2222-3333-4444-555555555555\",\n file: Pathname(\"image.jpg\"),\n model_type: \"kyc\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.AddImagesAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsAddImagesParams\n{\n File = FileUpload.FromPath(\"image.jpg\"),\n ModelType = \"kyc\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -68214,7 +78815,7 @@ } }, "403": { - "description": "Authentication or authorization failure. Missing, invalid and revoked keys return `403` (not `401`); so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist. Distinguish them by `detail`.", + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", "content": { "application/json": { "schema": { @@ -68426,12 +79027,37 @@ { "lang": "python", "label": "Python", - "source": "import os\n\nimport requests\n\nsession_id = '11111111-2222-3333-4444-555555555555'\nresp = requests.patch(\n f'https://verification.didit.me/v3/session/{session_id}/update-aml-status/',\n headers={'x-api-key': os.environ['DIDIT_API_KEY']},\n json={'status': 'Approved'},\n timeout=10,\n)\nresp.raise_for_status()\nbody = resp.json()\nprint(body['previous_status'], '->', body['status'])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_aml_status(\n \"11111111-2222-3333-4444-555555555555\",\n status=\"Approved\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const sessionId = '11111111-2222-3333-4444-555555555555';\nconst resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/update-aml-status/`, {\n method: 'PATCH',\n headers: { 'x-api-key': process.env.DIDIT_API_KEY, 'Content-Type': 'application/json' },\n body: JSON.stringify({ status: 'Approved' }),\n});\nif (!resp.ok) throw new Error(`Update failed: ${resp.status}`);\nconst body = await resp.json();\nconsole.log(body.previous_status, '->', body.status);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateAmlStatus(\"11111111-2222-3333-4444-555555555555\", {\n status: \"Approved\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateAMLStatus(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdateAMLStatusParams{\n\tStatus: \"Approved\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateAmlStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateAmlStatus(\"11111111-2222-3333-4444-555555555555\", SessionsUpdateAmlStatusParams.builder()\n .status(SessionsUpdateAmlStatusParams.Status.of(\"Approved\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->updateAmlStatus('11111111-2222-3333-4444-555555555555', [\n 'status' => 'Approved',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_aml_status(\n \"11111111-2222-3333-4444-555555555555\",\n status: \"Approved\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateAmlStatusAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsUpdateAmlStatusParams\n{\n Status = \"Approved\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -68533,7 +79159,7 @@ } }, "403": { - "description": "Authentication or authorization failure. Missing, invalid and revoked keys return `403` (not `401`); so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist. Distinguish them by `detail`.", + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", "content": { "application/json": { "schema": { @@ -68862,7 +79488,7 @@ "/v3/organization/bank-verification-pricing/": { "get": { "summary": "Get bank verification prices (public, unauthenticated)", - "description": "Returns the list price of each Bank Verification method in every country: bank sign-in with its balance and transactions add-ons, and the account check. Use it to quote a bank step before you build a workflow, or to show bank prices in your own product.\n\nPublic: send no auth header. The response contains no organization data and is the same for every caller. It is cached publicly for one hour and carries an `ETag`, so send `If-None-Match` to get a `304 Not Modified` when nothing changed.\n\nA method is `available` only where Didit serves it in production today, and its `price_usd` is `null` everywhere else, so the feed never shows a price you cannot buy. `available: false` covers a country with no approved price, a method the country does not support, and a route that is not switched on yet.\n\nThese are list prices before your plan discount. Your plan discount applies to the whole bank price, and a negotiated or contract price replaces the list price for your organization.", + "description": "Returns the list price of each Bank Verification method in every country: bank sign-in with its balance and transactions add-ons, and the account check. Bank Verification is not enabled in production yet, so a bank step is refused on production workflows until it is; treat these prices as a list price, not as an offer you can buy today. Use it to quote a bank step before you build a workflow, or to show bank prices in your own product.\n\nPublic: send no auth header. The response contains no organization data and is the same for every caller. It is cached publicly for one hour and carries an `ETag`, so send `If-None-Match` to get a `304 Not Modified` when nothing changed.\n\nA method is `available` only where Didit serves it in production today, and its `price_usd` is `null` everywhere else, so the feed never shows a price you cannot buy. `available: false` covers a country with no approved price, a method the country does not support, and a route that is not switched on yet.\n\nThese are list prices before your plan discount. Your plan discount applies to the whole bank price, and a negotiated or contract price replaces the list price for your organization.", "operationId": "get_v3_bank_verification_pricing", "tags": [ "Pricing" @@ -68880,12 +79506,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresp = requests.get('https://verification.didit.me/v3/organization/bank-verification-pricing/', timeout=10)\nresp.raise_for_status()\nfeed = resp.json()\nfor iso3, country in feed['countries'].items():\n sign_in = country['methods']['open_banking']\n if sign_in['available']:\n print(iso3, country['name'], sign_in['price_usd'])" + "source": "from didit import Didit\n\n# This call needs no API key.\nclient = Didit()\n\nresult = client.pricing.bank_verification()\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const feed = await fetch('https://verification.didit.me/v3/organization/bank-verification-pricing/').then((r) => r.json());\nconst gbr = feed.countries.GBR.methods;\nconsole.log(gbr.open_banking.available ? gbr.open_banking.price_usd : 'Not available');\nconsole.log(gbr.account_lookup.available ? gbr.account_lookup.price_usd : 'Not available');" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// This call needs no API key.\nconst didit = new Didit();\n\nconst result = await didit.pricing.bankVerification();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// This call needs no API key.\nclient := didit.NewClient()\n\nresult, err := client.Pricing.BankVerification(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// This call needs no API key.\nDidit client = new Didit();\n\nvar result = client.pricing().bankVerification();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "pricing->bankVerification();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# This call needs no API key.\ndidit = Didit::Client.new\n\nresult = didit.pricing.bank_verification\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// This call needs no API key.\nusing var client = new DiditClient();\n\nvar result = await client.Pricing.BankVerificationAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-sdk": { @@ -69098,7 +79749,7 @@ } }, "403": { - "description": "Missing or invalid credentials, a caller without the `write:sessions` privilege, a scoped API key without the access this endpoint needs, or a `session_id` that belongs to another application.", + "description": "Missing credentials, a caller without the `write:sessions` privilege, a scoped API key without the access this endpoint needs, or a `session_id` that belongs to another application.", "content": { "application/json": { "examples": { @@ -69149,7 +79800,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/simulate/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n json={\"scenario\": \"decline_aml_hit\", \"send_webhooks\": False},\n)\nresponse.raise_for_status()\nprint(response.json())" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.simulate(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n scenario=\"decline_aml_hit\",\n send_webhooks=False,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.simulate(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", {\n scenario: \"decline_aml_hit\",\n send_webhooks: false,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Simulate(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", didit.SandboxSimulateRequest{\n\tScenario: didit.String(\"decline_aml_hit\"),\n\tSendWebhooks: didit.Bool(false),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SandboxSimulateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().simulate(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", SandboxSimulateRequest.builder()\n .scenario(\"decline_aml_hit\")\n .sendWebhooks(false)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->simulate('3fa85f64-5717-4562-b3fc-2c963f66afa6', [\n 'scenario' => 'decline_aml_hit',\n 'send_webhooks' => false,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.simulate(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n scenario: \"decline_aml_hit\",\n send_webhooks: false\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.SimulateAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", new SandboxSimulateRequest\n{\n Scenario = \"decline_aml_hit\",\n SendWebhooks = false,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-sdk": { @@ -69470,7 +80151,7 @@ } }, "403": { - "description": "Missing or invalid credentials, a caller without the `read:sessions` privilege, a scoped API key without the access this endpoint needs, or a `session_id` that belongs to another application.", + "description": "Missing credentials, a caller without the `read:sessions` privilege, a scoped API key without the access this endpoint needs, or a `session_id` that belongs to another application.", "content": { "application/json": { "examples": { @@ -69521,7 +80202,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.get(\n \"https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/features/overrides/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n)\nresponse.raise_for_status()\nprint(response.json())" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.list_feature_overrides(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.listFeatureOverrides(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ListFeatureOverrides(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().listFeatureOverrides(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->listFeatureOverrides('3fa85f64-5717-4562-b3fc-2c963f66afa6');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.list_feature_overrides(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ListFeatureOverridesAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-sdk": { @@ -69621,7 +80332,7 @@ } }, "403": { - "description": "Missing or invalid credentials, a caller without the `write:sessions` privilege, a scoped API key without the access this endpoint needs, or a `session_id` that belongs to another application.", + "description": "Missing credentials, a caller without the `write:sessions` privilege, a scoped API key without the access this endpoint needs, or a `session_id` that belongs to another application.", "content": { "application/json": { "examples": { @@ -69694,7 +80405,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/features/overrides/9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3/cancel/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n)\nresponse.raise_for_status()\nprint(response.json())" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.cancel_feature_override(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.cancelFeatureOverride(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.CancelFeatureOverride(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().cancelFeatureOverride(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->cancelFeatureOverride('3fa85f64-5717-4562-b3fc-2c963f66afa6', '9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.cancel_feature_override(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.CancelFeatureOverrideAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-sdk": { @@ -69769,6 +80510,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/3fa85f64-5717-4562-b3fc-2c963f66afa6/tags/add/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"tag_uuid\": \"7c9e6679-7425-40de-944b-e07fc1f90ae7\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.add_tag(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n tag_uuid=\"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.addTag(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", {\n tag_uuid: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.AddTag(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", didit.NetworkTagRequest{\n\tTagUUID: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.NetworkTagRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().addTag(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", NetworkTagRequest.builder()\n .tagUuid(\"7c9e6679-7425-40de-944b-e07fc1f90ae7\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->addTag('3fa85f64-5717-4562-b3fc-2c963f66afa6', [\n 'tag_uuid' => '7c9e6679-7425-40de-944b-e07fc1f90ae7',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.add_tag(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n tag_uuid: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.AddTagAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", new NetworkTagRequest\n{\n TagUuid = \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -70248,6 +81024,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/3fa85f64-5717-4562-b3fc-2c963f66afa6/tags/remove/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"tag_uuid\": \"7c9e6679-7425-40de-944b-e07fc1f90ae7\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.remove_tag(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n tag_uuid=\"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.removeTag(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", {\n tag_uuid: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.RemoveTag(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", didit.NetworkTagRequest{\n\tTagUUID: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.NetworkTagRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().removeTag(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", NetworkTagRequest.builder()\n .tagUuid(\"7c9e6679-7425-40de-944b-e07fc1f90ae7\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "networks->removeTag('3fa85f64-5717-4562-b3fc-2c963f66afa6', [\n 'tag_uuid' => '7c9e6679-7425-40de-944b-e07fc1f90ae7',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.remove_tag(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n tag_uuid: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.RemoveTagAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", new NetworkTagRequest\n{\n TagUuid = \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -70582,6 +81393,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/requests/3fa85f64-5717-4562-b3fc-2c963f66afa6/remind/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.requests.remind(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requests.remind(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Requests.Remind(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requests().remind(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "cases->requests->remind('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.requests.remind(\n \"11111111-2222-3333-4444-555555555555\",\n \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Requests.RemindAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -70856,6 +81702,7 @@ "sender_kind", "subject", "html", + "text", "language", "will_be_sent", "not_sent_reason", @@ -70912,6 +81759,11 @@ "description": "The email's HTML exactly as it is sent, with its logo embedded as a data URL. Render it in a sandboxed frame, never directly in your application DOM.", "example": "..." }, + "text": { + "type": "string", + "description": "The email's words as plain text, as the person's Messages thread keeps them, for a compact preview (the HTML stays the email the person receives).", + "example": "Verification Approved\n\nYour identity has been successfully verified with Acme Pay. No further action is needed on your part." + }, "language": { "type": "string", "description": "The language the email is written in. English (`en`) when the `email_language` you asked for is not offered.", @@ -71028,7 +81880,7 @@ } }, "403": { - "description": "Missing or invalid credentials, a caller without the `write:sessions` privilege, a scoped API key without the access this endpoint needs, or a `session_id` that belongs to another application.", + "description": "Missing credentials, a caller without the `write:sessions` privilege, a scoped API key without the access this endpoint needs, or a `session_id` that belongs to another application.", "content": { "application/json": { "examples": { @@ -71079,7 +81931,37 @@ { "lang": "python", "label": "Python", - "source": "import requests\n\nresponse = requests.post(\n \"https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/decision-email-preview/\",\n headers={\"x-api-key\": \"YOUR_API_KEY\"},\n json={\"new_status\": \"Approved\", \"email_language\": \"en\"},\n)\nresponse.raise_for_status()\nprint(response.json())" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.preview_decision_email(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n new_status=\"Approved\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.previewDecisionEmail(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", {\n new_status: \"Approved\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.PreviewDecisionEmail(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", didit.SessionsPreviewDecisionEmailParams{\n\tNewStatus: \"Approved\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsPreviewDecisionEmailParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().previewDecisionEmail(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", SessionsPreviewDecisionEmailParams.builder()\n .newStatus(SessionsPreviewDecisionEmailParams.NewStatus.of(\"Approved\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->previewDecisionEmail('3fa85f64-5717-4562-b3fc-2c963f66afa6', [\n 'new_status' => 'Approved',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.preview_decision_email(\n \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n new_status: \"Approved\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.PreviewDecisionEmailAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", new SessionsPreviewDecisionEmailParams\n{\n NewStatus = \"Approved\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "x-didit-sdk": { @@ -71328,6 +82210,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/travel-rule/workspace/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.get()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.get();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.Get(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().get();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->workspace->get();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.get\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.GetAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -71384,6 +82301,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/workspace/claim/ \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"vasp_id\": \"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.claim(\n vasp_id=\"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.claim({\n vasp_id: \"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.Claim(ctx, didit.TravelRuleWorkspaceClaimRequest{\n\tVASPID: \"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleWorkspaceClaimRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().claim(TravelRuleWorkspaceClaimRequest.builder()\n .vaspId(\"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->workspace->claim([\n 'vasp_id' => '0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.claim(vasp_id: \"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.ClaimAsync(new TravelRuleWorkspaceClaimRequest\n{\n VaspId = \"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -71430,6 +82382,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/workspace/domain/code/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.send_domain_code()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.sendDomainCode();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.SendDomainCode(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().sendDomainCode();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->workspace->sendDomainCode();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.send_domain_code\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.SendDomainCodeAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -71486,6 +82473,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/workspace/domain/confirm/ \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"code\": \"123456\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.confirm_domain(\n code=\"123456\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.confirmDomain({\n code: \"123456\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.ConfirmDomain(ctx, didit.TravelRuleWorkspaceDomainConfirmRequest{\n\tCode: \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleWorkspaceDomainConfirmRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().confirmDomain(TravelRuleWorkspaceDomainConfirmRequest.builder()\n .code(\"123456\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->workspace->confirmDomain([\n 'code' => '123456',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.confirm_domain(code: \"123456\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.ConfirmDomainAsync(new TravelRuleWorkspaceDomainConfirmRequest\n{\n Code = \"123456\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -71532,6 +82554,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/workspace/domain/dns/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.verify_domain_dns()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.verifyDomainDns();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.VerifyDomainDNS(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().verifyDomainDns();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->workspace->verifyDomainDns();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.verify_domain_dns\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.VerifyDomainDnsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -71591,6 +82648,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/workspace/billing/ \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"enabled\": true}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.enable_billing(\n enabled=True,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.enableBilling({\n enabled: true,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.EnableBilling(ctx, didit.TravelRuleWorkspaceBillingRequest{\n\tEnabled: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleWorkspaceBillingRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().enableBilling(TravelRuleWorkspaceBillingRequest.builder()\n .enabled(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->workspace->enableBilling([\n 'enabled' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.enable_billing(enabled: true)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.EnableBillingAsync(new TravelRuleWorkspaceBillingRequest\n{\n Enabled = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -71703,7 +82795,44 @@ "method": "retrieve_summary", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_summary()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrieveSummary();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrieveSummary(ctx, didit.InvestigatorRetrieveSummaryParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrieveSummary();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->retrieveSummary();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_summary\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrieveSummaryAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/investigator/queue/": { @@ -71857,7 +82986,44 @@ "method": "list_queue", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.investigator.list_queue():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.investigator.listQueue()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Investigator.ListQueueAutoPaging(ctx, didit.InvestigatorListQueueParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.investigator().listQueue()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->listQueue() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.investigator.list_queue.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Investigator.ListQueueAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } + ] } }, "/v3/investigator/runs/{run_id}/": { @@ -71910,7 +83076,44 @@ "method": "retrieve_run", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_run(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrieveRun(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrieveRun(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrieveRun(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->retrieveRun('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_run(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrieveRunAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/investigator/runs/{run_id}/accept/": { @@ -71964,6 +83167,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/InvestigatorAcceptRequest" + }, + "example": { + "send_email": false } } } @@ -71973,7 +83179,44 @@ "method": "accept_run", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.accept_run(\n \"11111111-2222-3333-4444-555555555555\",\n send_email=False,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.acceptRun(\"11111111-2222-3333-4444-555555555555\", {\n send_email: false,\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.AcceptRun(ctx, \"11111111-2222-3333-4444-555555555555\", didit.InvestigatorAcceptRequest{\n\tSendEmail: didit.Bool(false),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.InvestigatorAcceptRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().acceptRun(\"11111111-2222-3333-4444-555555555555\", InvestigatorAcceptRequest.builder()\n .sendEmail(false)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->acceptRun('11111111-2222-3333-4444-555555555555', [\n 'send_email' => false,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.accept_run(\n \"11111111-2222-3333-4444-555555555555\",\n send_email: false\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.AcceptRunAsync(\"11111111-2222-3333-4444-555555555555\", new InvestigatorAcceptRequest\n{\n SendEmail = false,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/investigator/runs/{run_id}/override/": { @@ -72027,6 +83270,11 @@ "application/json": { "schema": { "$ref": "#/components/schemas/InvestigatorOverrideRequest" + }, + "example": { + "action": "decline", + "category": "evidence_misread", + "reason": "The proof of address is older than three months." } } } @@ -72036,7 +83284,44 @@ "method": "override_run", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.override_run(\n \"11111111-2222-3333-4444-555555555555\",\n action=\"decline\",\n category=\"evidence_misread\",\n reason=\"The proof of address is older than three months.\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.overrideRun(\"11111111-2222-3333-4444-555555555555\", {\n action: \"decline\",\n category: \"evidence_misread\",\n reason: \"The proof of address is older than three months.\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.OverrideRun(ctx, \"11111111-2222-3333-4444-555555555555\", didit.InvestigatorOverrideRequest{\n\tAction: \"decline\",\n\tCategory: \"evidence_misread\",\n\tReason: \"The proof of address is older than three months.\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.InvestigatorOverrideRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().overrideRun(\"11111111-2222-3333-4444-555555555555\", InvestigatorOverrideRequest.builder()\n .action(InvestigatorOverrideRequest.Action.of(\"decline\"))\n .category(InvestigatorOverrideRequest.Category.of(\"evidence_misread\"))\n .reason(\"The proof of address is older than three months.\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->overrideRun('11111111-2222-3333-4444-555555555555', [\n 'action' => 'decline',\n 'category' => 'evidence_misread',\n 'reason' => 'The proof of address is older than three months.',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.override_run(\n \"11111111-2222-3333-4444-555555555555\",\n action: \"decline\",\n category: \"evidence_misread\",\n reason: \"The proof of address is older than three months.\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.OverrideRunAsync(\"11111111-2222-3333-4444-555555555555\", new InvestigatorOverrideRequest\n{\n Action = \"decline\",\n Category = \"evidence_misread\",\n Reason = \"The proof of address is older than three months.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/investigator/runs/batch-accept/": { @@ -72085,7 +83370,44 @@ "method": "batch_accept_runs", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.batch_accept_runs(\n run_ids=[\"11111111-2222-3333-4444-555555555555\"],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.batchAcceptRuns({\n run_ids: [\"11111111-2222-3333-4444-555555555555\"],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.BatchAcceptRuns(ctx, didit.InvestigatorBatchAcceptRequest{\n\tRunIDs: []string{\"11111111-2222-3333-4444-555555555555\"},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.InvestigatorBatchAcceptRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().batchAcceptRuns(InvestigatorBatchAcceptRequest.builder()\n .runIds(List.of(\"11111111-2222-3333-4444-555555555555\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->batchAcceptRuns([\n 'run_ids' => ['11111111-2222-3333-4444-555555555555'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.batch_accept_runs(run_ids: [\"11111111-2222-3333-4444-555555555555\"])\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.BatchAcceptRunsAsync(new InvestigatorBatchAcceptRequest\n{\n RunIds = new string[] { \"11111111-2222-3333-4444-555555555555\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/investigator/transactions/{transaction_id}/": { @@ -72147,7 +83469,44 @@ "method": "retrieve_transaction", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_transaction(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrieveTransaction(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrieveTransaction(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrieveTransaction(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->retrieveTransaction('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_transaction(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrieveTransactionAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/investigator/guardrails/": { @@ -72215,7 +83574,44 @@ "method": "list_guardrails", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.list_guardrails()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.listGuardrails();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.ListGuardrails(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().listGuardrails();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->listGuardrails();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.list_guardrails\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.ListGuardrailsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/investigator/dashboard/": { @@ -72296,7 +83692,44 @@ "method": "retrieve_dashboard", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_dashboard()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrieveDashboard();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrieveDashboard(ctx, didit.InvestigatorRetrieveDashboardParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrieveDashboard();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->retrieveDashboard();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_dashboard\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrieveDashboardAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/investigator/performance/": { @@ -72382,7 +83815,44 @@ "method": "retrieve_performance", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_performance()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrievePerformance();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrievePerformance(ctx, didit.InvestigatorRetrievePerformanceParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrievePerformance();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->retrievePerformance();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_performance\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrievePerformanceAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/investigator/activity/": { @@ -72517,7 +83987,44 @@ "method": "list_activity", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.investigator.list_activity():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.investigator.listActivity()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Investigator.ListActivityAutoPaging(ctx, didit.InvestigatorListActivityParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.investigator().listActivity()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->listActivity() as $item) {\n print_r($item);\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.investigator.list_activity.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Investigator.ListActivityAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } + ] } }, "/v3/investigator/activity/export/": { @@ -72609,7 +84116,44 @@ "method": "export_activity", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.investigator.export_activity()\nwith open(\"download.csv\", \"wb\") as file:\n file.write(content)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.investigator.exportActivity();\nawait writeFile(\"download.csv\", Buffer.from(await content.arrayBuffer()));" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Investigator.ExportActivity(ctx, didit.InvestigatorExportActivityParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.csv\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.investigator().exportActivity()\n .writeTo(Path.of(\"download.csv\"));" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->exportActivity();\n$content->saveTo('download.csv');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.investigator.export_activity\nFile.binwrite(\"download.csv\", content)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Investigator.ExportActivityAsync();\nawait content.SaveToAsync(\"download.csv\");" + } + ] } }, "/v3/investigator/settings/": { @@ -72648,7 +84192,44 @@ "method": "retrieve_settings", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_settings()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrieveSettings();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrieveSettings(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrieveSettings();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->retrieveSettings();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_settings\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrieveSettingsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] }, "patch": { "operationId": "investigator_settings_update", @@ -72689,6 +84270,10 @@ "application/json": { "schema": { "$ref": "#/components/schemas/InvestigatorSettings" + }, + "example": { + "stage": "shadow", + "monthly_spend_limit": "500.00" } } } @@ -72698,7 +84283,44 @@ "method": "update_settings", "auth": "api_key", "server": true - } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.update_settings(\n stage=\"shadow\",\n monthly_spend_limit=\"500.00\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.updateSettings({\n stage: \"shadow\",\n monthly_spend_limit: \"500.00\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.UpdateSettings(ctx, didit.InvestigatorSettingsParam{\n\tStage: didit.Some(didit.InvestigatorSettingsStage(\"shadow\")),\n\tMonthlySpendLimit: didit.String(\"500.00\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.InvestigatorSettings;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().updateSettings(InvestigatorSettings.builder()\n .stage(InvestigatorSettings.Stage.of(\"shadow\"))\n .monthlySpendLimit(\"500.00\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "investigator->updateSettings([\n 'stage' => 'shadow',\n 'monthly_spend_limit' => '500.00',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.update_settings(\n stage: \"shadow\",\n monthly_spend_limit: \"500.00\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.UpdateSettingsAsync(new InvestigatorSettings\n{\n Stage = new InvestigatorSettingsStage(\"shadow\"),\n MonthlySpendLimit = \"500.00\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] } }, "/v3/travel-rule/wallet-addresses/import/": { @@ -72801,6 +84423,41 @@ "lang": "curl", "label": "curl (CSV)", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/wallet-addresses/import/ \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -F 'file=@wallets.csv;type=text/csv'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.wallet_addresses.bulk_import(\n body={\n \"entries\": [{\n \"address\": \"0xBeneficiaryWallet01\",\n \"chain\": \"ETH\",\n \"holder_name\": \"Ana Diaz\",\n \"holder_vendor_data\": \"user-042\",\n }, {\n \"address_hash\": \"4f7d2e1c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e\",\n \"chain\": \"bitcoin\",\n \"holder_vendor_data\": \"user-043\",\n }, {\n \"address\": \"rExchangeSharedAddress01\",\n \"chain\": \"XRP\",\n \"memo\": \"104729\",\n \"holder_name\": \"Ana Diaz\",\n }],\n },\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.walletAddresses.bulkImport({\n file: await fileFromPath(\"wallet-addresses.csv\"),\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.WalletAddresses.BulkImport(ctx, didit.TravelRuleWalletAddressesBulkImportParams{\n\tFile: didit.Some(didit.FileFromPath(\"wallet-addresses.csv\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.TravelRuleWalletAddressesBulkImportParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().walletAddresses().bulkImport(TravelRuleWalletAddressesBulkImportParams.builder()\n .file(Path.of(\"wallet-addresses.csv\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->walletAddresses->bulkImport([\n 'file' => File::fromPath('wallet-addresses.csv'),\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.wallet_addresses.bulk_import(\n body: {\n entries: [{\n address: \"0xBeneficiaryWallet01\",\n chain: \"ETH\",\n holder_name: \"Ana Diaz\",\n holder_vendor_data: \"user-042\",\n }, {\n address_hash: \"4f7d2e1c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e\",\n chain: \"bitcoin\",\n holder_vendor_data: \"user-043\",\n }, {\n address: \"rExchangeSharedAddress01\",\n chain: \"XRP\",\n memo: \"104729\",\n holder_name: \"Ana Diaz\",\n }],\n }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.WalletAddresses.BulkImportAsync(new TravelRuleWalletAddressesBulkImportParams\n{\n File = FileUpload.FromPath(\"wallet-addresses.csv\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -72954,6 +84611,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/travel-rule/counterparty-contacts/?counterparty={vasp_id}' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.counterparty_contacts.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.counterpartyContacts.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.CounterpartyContacts.ListAutoPaging(ctx, didit.TravelRuleCounterpartyContactsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().counterpartyContacts().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->counterpartyContacts->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.counterparty_contacts.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.CounterpartyContacts.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -73061,6 +84753,41 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/counterparty-contacts/ \\\n -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n -d '{\"counterparty\": \"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\", \"email\": \"compliance@counterparty.example\", \"name\": \"Compliance desk\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.counterparty_contacts.create(\n counterparty=\"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\",\n email=\"compliance@counterparty.example\",\n name=\"Compliance desk\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.counterpartyContacts.create({\n counterparty: \"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\",\n email: \"compliance@counterparty.example\",\n name: \"Compliance desk\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.CounterpartyContacts.Create(ctx, didit.TravelRuleCounterpartyContactCreate{\n\tCounterparty: \"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\",\n\tEmail: \"compliance@counterparty.example\",\n\tName: didit.String(\"Compliance desk\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleCounterpartyContactCreate;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().counterpartyContacts().create(TravelRuleCounterpartyContactCreate.builder()\n .counterparty(\"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\")\n .email(\"compliance@counterparty.example\")\n .name(\"Compliance desk\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->counterpartyContacts->create([\n 'counterparty' => '0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91',\n 'email' => 'compliance@counterparty.example',\n 'name' => 'Compliance desk',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.counterparty_contacts.create(\n counterparty: \"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\",\n email: \"compliance@counterparty.example\",\n name: \"Compliance desk\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.CounterpartyContacts.CreateAsync(new TravelRuleCounterpartyContactCreate\n{\n Counterparty = \"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\",\n Email = \"compliance@counterparty.example\",\n Name = \"Compliance desk\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -73140,6 +84867,41 @@ "lang": "curl", "label": "curl", "source": "curl -X DELETE https://verification.didit.me/v3/travel-rule/counterparty-contacts/{contact_uuid}/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.travel_rule.counterparty_contacts.delete(\n \"11111111-2222-3333-4444-555555555555\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.travelRule.counterpartyContacts.delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.TravelRule.CounterpartyContacts.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.travelRule().counterpartyContacts().delete(\"11111111-2222-3333-4444-555555555555\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->counterpartyContacts->delete('11111111-2222-3333-4444-555555555555');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.counterparty_contacts.delete(\"11111111-2222-3333-4444-555555555555\")" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.TravelRule.CounterpartyContacts.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");" } ], "responses": { @@ -73273,6 +85035,41 @@ "lang": "curl", "label": "curl", "source": "curl -X GET 'https://verification.didit.me/v3/travel-rule/transfers/?direction=OUTBOUND&status=AWAITING_COUNTERPARTY' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.transfers.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.transfers.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.Transfers.ListAutoPaging(ctx, didit.TravelRuleTransfersListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().transfers().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->transfers->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.transfers.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.Transfers.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -73414,6 +85211,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.list_providers()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.listProviders();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.ListProviders(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().listProviders();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->listProviders();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.list_providers\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.ListProvidersAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -73487,6 +85321,13 @@ "provider", "credentials" ] + }, + "example": { + "provider": "sumsub", + "credentials": { + "app_token": "YOUR_PROVIDER_APP_TOKEN", + "secret_key": "YOUR_PROVIDER_SECRET_KEY" + } } } } @@ -73536,6 +85377,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.check_provider(\n provider=\"sumsub\",\n credentials={\"app_token\": \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\": \"YOUR_PROVIDER_SECRET_KEY\"},\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.checkProvider({\n provider: \"sumsub\",\n credentials: { app_token: \"YOUR_PROVIDER_APP_TOKEN\", secret_key: \"YOUR_PROVIDER_SECRET_KEY\" },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.CheckProvider(ctx, didit.SessionsImportsCheckProviderParams{\n\tProvider: \"sumsub\",\n\tCredentials: map[string]string{\"app_token\": \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\": \"YOUR_PROVIDER_SECRET_KEY\"},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsImportsCheckProviderParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().checkProvider(SessionsImportsCheckProviderParams.builder()\n .provider(SessionsImportsCheckProviderParams.Provider.of(\"sumsub\"))\n .credentials(Map.of(\"app_token\", \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\", \"YOUR_PROVIDER_SECRET_KEY\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->checkProvider([\n 'provider' => 'sumsub',\n 'credentials' => ['app_token' => 'YOUR_PROVIDER_APP_TOKEN', 'secret_key' => 'YOUR_PROVIDER_SECRET_KEY'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.check_provider(\n provider: \"sumsub\",\n credentials: { app_token: \"YOUR_PROVIDER_APP_TOKEN\", secret_key: \"YOUR_PROVIDER_SECRET_KEY\" }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.CheckProviderAsync(new SessionsImportsCheckProviderParams\n{\n Provider = \"sumsub\",\n Credentials = new Dictionary { [\"app_token\"] = \"YOUR_PROVIDER_APP_TOKEN\", [\"secret_key\"] = \"YOUR_PROVIDER_SECRET_KEY\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -73634,6 +85512,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.start(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.start(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Start(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsImportsStartParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().start(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->start('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.start(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.StartAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -73695,6 +85610,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.pause(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.pause(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Pause(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().pause(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->pause('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.pause(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.PauseAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -73756,6 +85708,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.resume(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.resume(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Resume(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().resume(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->resume('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.resume(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.ResumeAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -73817,6 +85806,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.cancel(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.cancel(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Cancel(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().cancel(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->cancel('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.cancel(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.CancelAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -73865,6 +85891,12 @@ "description": "The record IDs or export file again, for `api_ids` and `export_file` providers." } } + }, + "example": { + "credentials": { + "app_token": "YOUR_PROVIDER_APP_TOKEN", + "secret_key": "YOUR_PROVIDER_SECRET_KEY" + } } } } @@ -73902,6 +85934,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.retry(\n \"11111111-2222-3333-4444-555555555555\",\n credentials={\"app_token\": \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\": \"YOUR_PROVIDER_SECRET_KEY\"},\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.retry(\"11111111-2222-3333-4444-555555555555\", {\n credentials: { app_token: \"YOUR_PROVIDER_APP_TOKEN\", secret_key: \"YOUR_PROVIDER_SECRET_KEY\" },\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Retry(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsImportsRetryParams{\n\tCredentials: didit.Some(map[string]string{\"app_token\": \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\": \"YOUR_PROVIDER_SECRET_KEY\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsImportsRetryParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().retry(\"11111111-2222-3333-4444-555555555555\", SessionsImportsRetryParams.builder()\n .credentials(Map.of(\"app_token\", \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\", \"YOUR_PROVIDER_SECRET_KEY\"))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->retry('11111111-2222-3333-4444-555555555555', [\n 'credentials' => ['app_token' => 'YOUR_PROVIDER_APP_TOKEN', 'secret_key' => 'YOUR_PROVIDER_SECRET_KEY'],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.retry(\n \"11111111-2222-3333-4444-555555555555\",\n credentials: { app_token: \"YOUR_PROVIDER_APP_TOKEN\", secret_key: \"YOUR_PROVIDER_SECRET_KEY\" }\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.RetryAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsImportsRetryParams\n{\n Credentials = new Dictionary { [\"app_token\"] = \"YOUR_PROVIDER_APP_TOKEN\", [\"secret_key\"] = \"YOUR_PROVIDER_SECRET_KEY\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -74000,6 +86069,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.list_jobs()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.listJobs();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.ListJobs(ctx, didit.SessionsImportsListJobsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().listJobs();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->listJobs();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.list_jobs\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.ListJobsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -74058,6 +86164,43 @@ { "ApiKeyAuth": [] } + ], + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.list_active_jobs()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.listActiveJobs();\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.ListActiveJobs(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().listActiveJobs();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->imports->listActiveJobs();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.list_active_jobs\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.ListActiveJobsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } ] } }, @@ -74178,6 +86321,36 @@ "lang": "curl", "label": "curl (selected transactions)", "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/transactions/delete/' \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"transaction_uuids\": [\"abcdef12-3456-7890-abcd-ef1234567890\"]}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.transactions.batch_delete(\n body={\n \"transaction_uuids\": [\"abcdef12-3456-7890-abcd-ef1234567890\", \"12345678-90ab-cdef-1234-567890abcdef\"],\n },\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.transactions.batchDelete({\n transaction_uuids: [\"abcdef12-3456-7890-abcd-ef1234567890\", \"12345678-90ab-cdef-1234-567890abcdef\"],\n});" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.TransactionsBatchDeleteParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.transactions().batchDelete(TransactionsBatchDeleteParams.builder()\n .putAdditionalProperty(\"transaction_uuids\", List.of(\"abcdef12-3456-7890-abcd-ef1234567890\", \"12345678-90ab-cdef-1234-567890abcdef\"))\n .build());" + }, + { + "lang": "php", + "label": "PHP", + "source": "transactions->batchDelete([\n 'transaction_uuids' => ['abcdef12-3456-7890-abcd-ef1234567890', '12345678-90ab-cdef-1234-567890abcdef'],\n]);" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.transactions.batch_delete(\n body: {\n transaction_uuids: [\"abcdef12-3456-7890-abcd-ef1234567890\", \"12345678-90ab-cdef-1234-567890abcdef\"],\n }\n)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Transactions.BatchDeleteAsync(new TransactionsBatchDeleteParams\n{\n TransactionUuids = new string[] { \"abcdef12-3456-7890-abcd-ef1234567890\", \"12345678-90ab-cdef-1234-567890abcdef\" },\n});" } ], "responses": { @@ -74264,6 +86437,36 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/travel-rule/networks/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.networks.retrieve()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.networks.retrieve();\nconsole.log(result);" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().networks().retrieve();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->networks->retrieve();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.networks.retrieve\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Networks.RetrieveAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -74370,6 +86573,36 @@ "lang": "curl", "label": "curl", "source": "curl -X GET https://verification.didit.me/v3/travel-rule/networks/questionnaire/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.networks.retrieve_questionnaire()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.networks.retrieveQuestionnaire();\nconsole.log(result);" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().networks().retrieveQuestionnaire();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->networks->retrieveQuestionnaire();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.networks.retrieve_questionnaire\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Networks.RetrieveQuestionnaireAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -74411,6 +86644,36 @@ "lang": "curl", "label": "curl", "source": "curl -X PUT https://verification.didit.me/v3/travel-rule/networks/questionnaire/ \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"legal_name\": \"Example VASP Ltd\", \"incorporation_country\": \"ES\", \"aml_ctf_policy_attested\": true}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.networks.update_questionnaire(\n legal_name=\"Example VASP Ltd\",\n incorporation_country=\"ES\",\n aml_ctf_policy_attested=True,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.networks.updateQuestionnaire({\n legal_name: \"Example VASP Ltd\",\n incorporation_country: \"ES\",\n aml_ctf_policy_attested: true,\n});\nconsole.log(result);" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleNetworkQuestionnaireAnswers;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().networks().updateQuestionnaire(TravelRuleNetworkQuestionnaireAnswers.builder()\n .legalName(\"Example VASP Ltd\")\n .incorporationCountry(\"ES\")\n .amlCtfPolicyAttested(true)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->networks->updateQuestionnaire([\n 'legal_name' => 'Example VASP Ltd',\n 'incorporation_country' => 'ES',\n 'aml_ctf_policy_attested' => true,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.networks.update_questionnaire(\n legal_name: \"Example VASP Ltd\",\n incorporation_country: \"ES\",\n aml_ctf_policy_attested: true\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Networks.UpdateQuestionnaireAsync(new TravelRuleNetworkQuestionnaireAnswers\n{\n LegalName = \"Example VASP Ltd\",\n IncorporationCountry = \"ES\",\n AmlCtfPolicyAttested = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -74419,6 +86682,11 @@ "application/json": { "schema": { "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaireAnswers" + }, + "example": { + "legal_name": "Example VASP Ltd", + "incorporation_country": "ES", + "aml_ctf_policy_attested": true } } } @@ -74509,6 +86777,36 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/networks/questionnaire/submit/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.networks.submit_questionnaire()\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.networks.submitQuestionnaire();\nconsole.log(result);" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().networks().submitQuestionnaire();\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->networks->submitQuestionnaire();\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.networks.submit_questionnaire\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Networks.SubmitQuestionnaireAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -74612,6 +86910,36 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/networks/gtr/request/ \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.networks.request_access(\n \"your-network\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.networks.requestAccess(\"your-network\");\nconsole.log(result);" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().networks().requestAccess(\"your-network\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->networks->requestAccess('your-network');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.networks.request_access(\"your-network\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Networks.RequestAccessAsync(\"your-network\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -74702,12 +87030,32 @@ { "lang": "python", "label": "Python", - "source": "import os, requests\n\nresp = requests.post(\n \"https://verification.didit.me/v3/address-validation/\",\n headers={\"x-api-key\": os.environ[\"DIDIT_API_KEY\"], \"Content-Type\": \"application/json\"},\n json={\n \"address_line_1\": \"1600 Amphitheatre Pkwy\",\n \"city\": \"Mountain View\",\n \"region\": \"CA\",\n \"postal_code\": \"94043\",\n \"country\": \"US\",\n },\n timeout=15,\n)\nresp.raise_for_status()\nresult = resp.json()[\"address_validation\"]\nprint(result[\"status\"], result[\"formatted_address\"])" + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.address_validation.validate(\n address_line_1=\"1600 Amphitheatre Pkwy\",\n city=\"Mountain View\",\n region=\"CA\",\n postal_code=\"94043\",\n country=\"US\",\n)\nprint(result)" }, { "lang": "javascript", - "label": "JavaScript", - "source": "const res = await fetch('https://verification.didit.me/v3/address-validation/', {\n method: 'POST',\n headers: {\n 'x-api-key': 'YOUR_API_KEY',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ address: 'Paseo de la Castellana 259, 28046 Madrid', country: 'ES' }),\n});\nconst { address_validation } = await res.json();\nconsole.log(address_validation.status, address_validation.formatted_address);" + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.addressValidation.validate({\n address_line_1: \"1600 Amphitheatre Pkwy\",\n city: \"Mountain View\",\n region: \"CA\",\n postal_code: \"94043\",\n country: \"US\",\n});\nconsole.log(result);" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.AddressValidationRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.addressValidation().validate(AddressValidationRequest.builder()\n .addressLine1(\"1600 Amphitheatre Pkwy\")\n .city(\"Mountain View\")\n .region(\"CA\")\n .postalCode(\"94043\")\n .country(\"US\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "addressValidation->validate([\n 'address_line_1' => '1600 Amphitheatre Pkwy',\n 'city' => 'Mountain View',\n 'region' => 'CA',\n 'postal_code' => '94043',\n 'country' => 'US',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.address_validation.validate(\n address_line_1: \"1600 Amphitheatre Pkwy\",\n city: \"Mountain View\",\n region: \"CA\",\n postal_code: \"94043\",\n country: \"US\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.AddressValidation.ValidateAsync(new AddressValidationRequest\n{\n AddressLine1 = \"1600 Amphitheatre Pkwy\",\n City = \"Mountain View\",\n Region = \"CA\",\n PostalCode = \"94043\",\n Country = \"US\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "requestBody": { @@ -74882,6 +87230,36 @@ "lang": "curl", "label": "curl", "source": "curl https://verification.didit.me/v3/travel-rule/wallet-proofs/?status=PENDING \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.wallet_proofs.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.walletProofs.list()) {\n console.log(item);\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().walletProofs().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->walletProofs->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.wallet_proofs.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.WalletProofs.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" } ], "responses": { @@ -74963,6 +87341,10 @@ "application/json": { "schema": { "$ref": "#/components/schemas/TravelRuleWalletProofDecision" + }, + "example": { + "decision": "approve", + "note": "Address matches the wallet app." } } } @@ -74972,6 +87354,36 @@ "lang": "curl", "label": "curl", "source": "curl -X POST https://verification.didit.me/v3/travel-rule/wallet-proofs/{proof_uuid}/decision/ \\\n -H 'x-api-key: YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"decision\": \"approve\", \"note\": \"Address matches the wallet app.\"}'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.wallet_proofs.decide(\n \"11111111-2222-3333-4444-555555555555\",\n decision=\"approve\",\n note=\"Address matches the wallet app.\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.walletProofs.decide(\"11111111-2222-3333-4444-555555555555\", {\n decision: \"approve\",\n note: \"Address matches the wallet app.\",\n});\nconsole.log(result);" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleWalletProofDecision;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().walletProofs().decide(\"11111111-2222-3333-4444-555555555555\", TravelRuleWalletProofDecision.builder()\n .decision(TravelRuleWalletProofDecision.Decision.of(\"approve\"))\n .note(\"Address matches the wallet app.\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->walletProofs->decide('11111111-2222-3333-4444-555555555555', [\n 'decision' => 'approve',\n 'note' => 'Address matches the wallet app.',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.wallet_proofs.decide(\n \"11111111-2222-3333-4444-555555555555\",\n decision: \"approve\",\n note: \"Address matches the wallet app.\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.WalletProofs.DecideAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleWalletProofDecision\n{\n Decision = \"approve\",\n Note = \"Address matches the wallet app.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" } ], "responses": { @@ -75234,6 +87646,3778 @@ } } } + }, + "/v3/id-verification/wallets/verifications/{request_id}/response/": { + "post": { + "operationId": "submit_wallet_verification_response", + "x-didit-sdk": { + "resource": "id_wallets", + "method": "submit_verification_response", + "auth": "api_key", + "server": true + }, + "description": "Digital Credentials API wallets (Google Wallet): send what the wallet returned to your page or app for a verification whose next_action is request_digital_credential. Didit decrypts it, checks the issuer's signature against the trusted issuer roots, every returned value against its signed digest, and the device signature over your origin and this request, then decides the verification: verified (billed once) or declined with the error code. Single use: a second submit returns the decided verification.", + "summary": "Submit a wallet response", + "parameters": [ + { + "in": "path", + "name": "request_id", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The request_id the start endpoint returned.", + "required": true + } + ], + "tags": [ + "Digital ID wallets" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletDigitalCredentialResponseRequest" + }, + "example": { + "response": { + "protocol": "openid4vp-v1-signed", + "data": { + "response": "" + } + } + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletDigitalCredentialResponseRequest" + }, + "example": { + "response": { + "protocol": "openid4vp-v1-signed", + "data": { + "response": "" + } + } + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletDigitalCredentialResponseRequest" + }, + "example": { + "response": { + "protocol": "openid4vp-v1-signed", + "data": { + "response": "" + } + } + } + } + }, + "required": true + }, + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse" + }, + "example": { + "request_id": "00000000-0000-4000-8000-000000000001", + "wallet_verification": { + "wallet": { + "id": "google_wallet", + "name": "Google Wallet", + "issuing_authority": "Google Wallet (ID pass) and US state issuers (mobile driving licence)" + }, + "country": "USA", + "status": "Approved", + "outcome": "verified", + "error": null, + "interaction": "digital_credentials", + "simulated": false, + "expires_at": "2026-01-01T10:10:00Z", + "next_action": null, + "identity": { + "full_name": "Alex Example", + "first_name": "Alex", + "last_name": "Example", + "date_of_birth": "1990-01-31", + "nationality": "USA", + "issuing_state": "USA" + }, + "attributes": { + "document_number": "X0000000", + "document_expiry_date": "2030-01-31" + }, + "level_of_assurance": "substantial", + "verified_at": "2026-01-01T10:01:00Z", + "signature_valid": true, + "credential_type": "person_identification" + }, + "vendor_data": "your-customer-reference", + "metadata": { + "reference": "example" + }, + "created_at": "2026-01-01T10:00:00Z" + } + } + }, + "description": "" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage" + } + } + }, + "description": "Missing credentials (x-api-key or Authorization: Bearer)." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError" + } + } + }, + "description": "error not_found: no wallet verification of this application has this request_id." + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest" + } + } + }, + "description": "Field validation errors ({field: [messages]})." + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError" + } + } + }, + "description": "error not_a_digital_credentials_wallet: this verification does not take a wallet response." + }, + "503": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError" + } + } + }, + "description": "error wallet_not_configured: this environment cannot verify the wallet." + } + }, + "x-codeSamples": [ + { + "lang": "curl", + "label": "cURL", + "source": "curl --request POST \\\n --url https://verification.didit.me/v3/id-verification/wallets/verifications/REQUEST_ID/response/ \\\n --header 'x-api-key: YOUR_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"response\": {\n \"protocol\": \"openid4vp-v1-signed\",\n \"data\": {\n \"response\": \"\"\n }\n }\n}'" + } + ] + } + }, + "/v3/id-verification/wallets/google-wallet/": { + "post": { + "operationId": "start_google_wallet_wallet_verification", + "x-didit-sdk": { + "resource": "id_wallets", + "method": "start_google_wallet", + "auth": "api_key", + "server": true + }, + "description": "Start a Google Wallet sign-in (Google Wallet (ID pass) and US state issuers (mobile driving licence); USA, GBR, BRA, SGP, TWN) without any workflow. Billed once, only when the identity is verified. The response carries next_action.type=request_digital_credential with a request Didit signed for your application, usable only from origin. In a user gesture there, pass next_action.digital_credentials.request to navigator.credentials.get({digital: ...}) (or to Android Credential Manager as GetDigitalCredentialOption requestJson), then POST what the wallet returns to /v3/id-verification/wallets/verifications/{request_id}/response/. The browser offers its own QR code when the wallet is on another device. Sandbox applications get a deterministic simulation (simulated: true) that never contacts the provider.", + "summary": "Start Google Wallet verification", + "parameters": [ + { + "in": "header", + "name": "Idempotency-Key", + "schema": { + "type": "string" + }, + "description": "Optional retry-safety key (max 255 characters). Retrying with the same key, wallet and body returns the original verification without starting a second sign-in; the same key with another wallet or body returns 409 idempotency_key_reused." + } + ], + "tags": [ + "Digital ID wallets" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest" + }, + "example": { + "country": "USA", + "vendor_data": "your-customer-reference", + "metadata": { + "reference": "example" + }, + "origin": "https://app.example.com" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest" + } + } + }, + "required": true + }, + "security": [ + { + "ApiKeyAuth": [] + }, + { + "BearerAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse" + }, + "example": { + "request_id": "00000000-0000-4000-8000-000000000001", + "wallet_verification": { + "wallet": { + "id": "google_wallet", + "name": "Google Wallet", + "issuing_authority": "Google Wallet (ID pass) and US state issuers (mobile driving licence)" + }, + "country": "USA", + "status": "Not Finished", + "outcome": "pending", + "error": null, + "interaction": "digital_credentials", + "simulated": false, + "expires_at": "2026-01-01T10:10:00Z", + "next_action": { + "type": "request_digital_credential", + "digital_credentials": { + "protocol": "openid4vp-v1-signed", + "request": { + "requests": [ + { + "protocol": "openid4vp-v1-signed", + "data": { + "request": "" + } + } + ] + } + } + }, + "identity": null, + "attributes": null, + "level_of_assurance": null, + "verified_at": null, + "signature_valid": null, + "credential_type": "person_identification" + }, + "vendor_data": "your-customer-reference", + "metadata": { + "reference": "example" + }, + "created_at": "2026-01-01T10:00:00Z" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest" + } + } + }, + "description": "Field validation errors ({field: [messages]}), or error return_url_invalid, return_url_not_allowed, origin_invalid, origin_not_allowed, invalid_personal_code, invalid_phone_number or idempotency_key_invalid." + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden" + } + } + }, + "description": "Missing credentials ({detail}), or error wallet_unavailable, insufficient_credits or contract_rate_missing." + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError" + } + } + }, + "description": "error idempotency_key_reused or idempotency_key_in_progress (with Retry-After)." + }, + "502": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError" + } + } + }, + "description": "error wallet_provider_unavailable: the provider could not start; nothing was created." + }, + "503": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError" + } + } + }, + "description": "error wallet_not_configured: this environment cannot reach the wallet." + } + }, + "x-codeSamples": [ + { + "lang": "curl", + "label": "cURL", + "source": "curl --request POST \\\n --url https://verification.didit.me/v3/id-verification/wallets/google-wallet/ \\\n --header 'x-api-key: YOUR_API_KEY' \\\n --header 'Idempotency-Key: your-unique-attempt-key' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"country\": \"USA\",\n \"vendor_data\": \"your-customer-reference\",\n \"metadata\": {\n \"reference\": \"example\"\n },\n \"origin\": \"https://app.example.com\"\n}'" + } + ], + "x-didit-wallet-id": "google_wallet" + } + }, + "/v3/session/{sessionId}/kyb/documents/": { + "post": { + "summary": "Upload KYB documents to a session", + "description": "Upload one or more corporate documents (articles of incorporation, shareholder register, certificate of incorporation, ...) to the KYB Documents step of a Business Verification session, from your own server instead of the hosted page. Didit runs the hosted pipeline: compression, OCR, tampering and cross-document checks, document grouping, and advances the session when the required document groups are satisfied. The step costs one flat fee however many files you send. The session must be open and on the KYB Documents step, and the company chosen at the registry step must exist. Read the people the documents name with `GET /v3/session/{sessionId}/kyb/extracted-parties/`. Requires `write:businesses`.", + "operationId": "post_v3_session_kyb_documents", + "x-didit-sdk": { + "resource": "sessions", + "method": "upload_kyb_documents", + "auth": "api_key", + "server": true + }, + "tags": [ + "Sessions" + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "description": "UUID of the Business Verification (KYB) session. It must belong to the application of the API key.", + "schema": { + "type": "string", + "format": "uuid", + "example": "33333333-4444-5555-6666-777777777777" + } + }, + { + "name": "node_id", + "in": "query", + "required": false, + "description": "Workflow node of the KYB step. Only needed when the workflow has more than one KYB node; by default Didit uses the session's own node.", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "required": [ + "documents" + ], + "properties": { + "documents": { + "type": "array", + "items": { + "type": "string", + "format": "binary" + }, + "description": "Files to upload: JPG, JPEG, PNG, TIFF, WEBP, PDF or ZIP archives of them. PDFs up to 50 MB, photos up to 6 MB before compression." + }, + "document_passwords": { + "type": "array", + "items": { + "type": "string" + }, + "description": "One entry per file in `documents`, in the same order: the password of a protected PDF, empty for any other file." + }, + "document_group": { + "type": "string", + "enum": [ + "LEGAL_PRESENCE", + "COMPANY_DETAILS", + "OWNERSHIP_STRUCTURE", + "REPRESENTATIVES_AUTHORIZATION" + ], + "description": "Required document group this upload answers." + }, + "locale": { + "type": "string", + "maxLength": 10, + "description": "Locale used to translate the response of the next step." + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Documents processed. When every required group is satisfied the session advances and `next_step` names the next step; otherwise it stays on the Documents step and `document_groups` and `document_answer` say what is still missing.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "valid": { + "type": "boolean" + }, + "next_step": { + "type": "string", + "nullable": true, + "description": "Step the session is on after the upload." + }, + "kyb_status": { + "type": "string", + "description": "Status of the company check." + }, + "document_answer": { + "type": "object", + "additionalProperties": true, + "description": "Result per uploaded document and the uploads left." + } + }, + "additionalProperties": true + }, + "example": { + "valid": true, + "next_step": "KYB_KEY_PEOPLE", + "kyb_status": "In Progress" + } + } + } + }, + "400": { + "description": "A document was rejected (tampering, unreadable or unsupported) or the session has no KYB company yet. Retry with another file while attempts remain.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "message": "No KYB company found. Submit company data first." + } + } + } + }, + "402": { + "description": "The organization has no credit left for the documents step.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "detail": "Insufficient credits." + } + } + } + }, + "401": { + "description": "The scoped API key has expired. This is the only case that returns `401`: a missing, invalid or revoked key returns `403`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Expired key": { + "summary": "The key's expiry date has passed", + "value": { + "detail": "This API key has expired." + } + } + } + } + } + }, + "403": { + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Missing or invalid credentials": { + "summary": "No x-api-key header, or the key failed validation", + "value": { + "detail": "Authentication credentials were not provided or are invalid." + } + }, + "Other application": { + "summary": "A valid key that belongs to a different application than the session", + "value": { + "detail": "You do not have permission to perform this action." + } + }, + "Scoped key without decisions write": { + "summary": "Scoped key lacks decisions: write", + "value": { + "detail": "This API key has no write access to decisions." + } + }, + "IP not allowed": { + "summary": "Request from outside the key's IP allowlist", + "value": { + "detail": "This API key can't be used from this IP address." + } + } + } + } + } + }, + "404": { + "description": "The session does not exist, was deleted, belongs to another application or is outside a scoped key's limits; no detail distinguishes them.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "detail": "Session not found." + } + } + } + }, + "409": { + "description": "The session is finished (`kyb_session_not_writable`) or is not on the KYB Documents step (`kyb_step_mismatch`, with `next_step` naming the step it is on).", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + }, + "code": { + "type": "string" + }, + "next_step": { + "type": "string" + } + } + }, + "example": { + "detail": "The session is not on the step this operation completes.", + "code": "kyb_step_mismatch", + "next_step": "KYB_REGISTRY" + } + } + } + }, + "429": { + "description": "Rate limit exceeded: 300 write (POST, PATCH, DELETE) requests per minute per API key. Wait `Retry-After` seconds before retrying; the `X-RateLimit-*` headers show the budget.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Rate limited": { + "summary": "Budget for the current minute exhausted", + "value": { + "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute." + } + } + } + } + }, + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying.", + "schema": { + "type": "integer", + "minimum": 1, + "example": 30 + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.upload_kyb_documents(\n \"33333333-4444-5555-6666-777777777777\",\n documents=[open(\"document.pdf\", \"rb\")],\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.uploadKybDocuments(\"33333333-4444-5555-6666-777777777777\", {\n documents: [await fileFromPath(\"document.pdf\")],\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UploadKYBDocuments(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsUploadKYBDocumentsParams{\n\tDocuments: []didit.File{didit.FileFromPath(\"document.pdf\")},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.nio.file.Path;\nimport java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.SessionsUploadKybDocumentsParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().uploadKybDocuments(\"33333333-4444-5555-6666-777777777777\", SessionsUploadKybDocumentsParams.builder()\n .documents(List.of(Path.of(\"document.pdf\")))\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->uploadKybDocuments('33333333-4444-5555-6666-777777777777', [\n 'documents' => [File::fromPath('document.pdf')],\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.upload_kyb_documents(\n \"33333333-4444-5555-6666-777777777777\",\n documents: [Pathname(\"document.pdf\")]\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UploadKybDocumentsAsync(\"33333333-4444-5555-6666-777777777777\", new SessionsUploadKybDocumentsParams\n{\n Documents = new FileUpload[] { FileUpload.FromPath(\"document.pdf\") },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] + } + }, + "/v3/session/{sessionId}/kyb/extracted-parties/": { + "get": { + "summary": "List the parties named by the uploaded documents", + "description": "Return the shareholders and directors that the documents uploaded to this KYB session name, merged per person and attributed to the documents that named them. Show them to your applicant to confirm, then declare them with the party draft endpoints. A range stays a range: `ownership_percent.text` keeps the verbatim figure and `min` / `max` the numbers read from it. Nobody is labelled a UBO here; that is decided when the parties are submitted, from the role settings and ownership thresholds of the workflow. The same list is in the session decision as `document_verifications[].extracted_parties`. Requires `read:businesses` or `read:sessions`.", + "operationId": "get_v3_session_kyb_extracted_parties", + "x-didit-sdk": { + "resource": "sessions", + "method": "list_kyb_extracted_parties", + "auth": "api_key", + "server": true + }, + "tags": [ + "Sessions" + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "description": "UUID of the Business Verification (KYB) session. It must belong to the application of the API key.", + "schema": { + "type": "string", + "format": "uuid", + "example": "33333333-4444-5555-6666-777777777777" + } + }, + { + "name": "node_id", + "in": "query", + "required": false, + "description": "Workflow node of the KYB step. Only needed when the workflow has more than one KYB node; by default Didit uses the session's own node.", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Parties named by the current documents.", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "parties", + "document_count" + ], + "properties": { + "parties": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "entity_type": { + "type": "string", + "enum": [ + "person", + "company" + ] + }, + "first_name": { + "type": "string", + "nullable": true + }, + "last_name": { + "type": "string", + "nullable": true + }, + "appointment_date": { + "type": "string", + "nullable": true + }, + "designation": { + "type": "string", + "nullable": true + }, + "roles": { + "type": "array", + "items": { + "type": "object", + "properties": { + "role": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ] + }, + "ownership_percent": { + "type": "object", + "properties": { + "text": { + "type": "string", + "nullable": true, + "description": "The ownership figure exactly as the document states it, such as `25-50%`, `>50%` or `NO EXHIBE`." + }, + "min": { + "type": "number", + "nullable": true, + "description": "Lower number read out of `text`; null when it states none." + }, + "max": { + "type": "number", + "nullable": true, + "description": "Upper number read out of `text`; null when it states none." + } + } + } + } + } + }, + "documents": { + "type": "array", + "description": "The uploaded documents that named this party.", + "items": { + "type": "object", + "properties": { + "document_uuid": { + "type": "string", + "format": "uuid" + }, + "document_type": { + "type": "string", + "nullable": true + }, + "document_subtype": { + "type": "string", + "nullable": true + }, + "original_filename": { + "type": "string", + "nullable": true + }, + "status": { + "type": "string", + "nullable": true + } + } + } + } + } + }, + "description": "The shareholders and directors the uploaded documents name, merged per person. Nobody is labelled a UBO here: that is decided when the parties are submitted." + }, + "document_count": { + "type": "integer", + "description": "Number of uploaded documents the list was read from." + }, + "node_id": { + "type": "string", + "nullable": true + } + } + }, + "example": { + "parties": [ + { + "name": "Ana Lopez", + "entity_type": "person", + "first_name": "Ana", + "last_name": "Lopez", + "appointment_date": null, + "designation": "Administrador unico", + "roles": [ + { + "role": "shareholder", + "ownership_percent": { + "text": "60%", + "min": 60, + "max": 60 + } + } + ], + "documents": [ + { + "document_uuid": "0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41", + "document_type": "OWNERSHIP_STRUCTURE", + "document_subtype": "ARTICLES_OF_INCORPORATION", + "original_filename": "acta_constitutiva.pdf", + "status": "Approved" + } + ] + } + ], + "document_count": 1, + "node_id": "node_kyb_documents" + } + } + } + }, + "401": { + "description": "The scoped API key has expired. This is the only case that returns `401`: a missing, invalid or revoked key returns `403`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Expired key": { + "summary": "The key's expiry date has passed", + "value": { + "detail": "This API key has expired." + } + } + } + } + } + }, + "403": { + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Missing or invalid credentials": { + "summary": "No x-api-key header, or the key failed validation", + "value": { + "detail": "Authentication credentials were not provided or are invalid." + } + }, + "Other application": { + "summary": "A valid key that belongs to a different application than the session", + "value": { + "detail": "You do not have permission to perform this action." + } + }, + "Scoped key without decisions write": { + "summary": "Scoped key lacks decisions: write", + "value": { + "detail": "This API key has no write access to decisions." + } + }, + "IP not allowed": { + "summary": "Request from outside the key's IP allowlist", + "value": { + "detail": "This API key can't be used from this IP address." + } + } + } + } + } + }, + "404": { + "description": "The session does not exist, was deleted, belongs to another application or is outside a scoped key's limits; no detail distinguishes them.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "detail": "Session not found." + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.list_kyb_extracted_parties(\n \"33333333-4444-5555-6666-777777777777\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.listKybExtractedParties(\"33333333-4444-5555-6666-777777777777\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ListKYBExtractedParties(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsListKYBExtractedPartiesParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().listKybExtractedParties(\"33333333-4444-5555-6666-777777777777\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->listKybExtractedParties('33333333-4444-5555-6666-777777777777');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.list_kyb_extracted_parties(\"33333333-4444-5555-6666-777777777777\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ListKybExtractedPartiesAsync(\"33333333-4444-5555-6666-777777777777\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] + } + }, + "/v3/session/{sessionId}/kyb/parties/drafts/": { + "get": { + "summary": "List the KYB party drafts", + "description": "List the parties you are preparing for this KYB session, oldest first. A draft is not a declared party: it does not appear in the decision or the console and creates no verification session until you submit it with `POST /v3/session/{sessionId}/kyb/parties/submit/`. Requires `write:businesses`.", + "operationId": "get_v3_session_kyb_party_drafts", + "x-didit-sdk": { + "resource": "sessions", + "method": "list_kyb_party_drafts", + "auth": "api_key", + "server": true + }, + "tags": [ + "Sessions" + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "description": "UUID of the Business Verification (KYB) session. It must belong to the application of the API key.", + "schema": { + "type": "string", + "format": "uuid", + "example": "33333333-4444-5555-6666-777777777777" + } + }, + { + "name": "node_id", + "in": "query", + "required": false, + "description": "Workflow node of the KYB step. Only needed when the workflow has more than one KYB node; by default Didit uses the session's own node.", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The stored drafts.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "parties": { + "type": "array", + "items": { + "type": "object", + "required": [ + "draft_id", + "created_at", + "updated_at", + "party" + ], + "properties": { + "draft_id": { + "type": "string", + "format": "uuid" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "party": { + "type": "object", + "required": [ + "entity_type", + "nationality" + ], + "properties": { + "entity_type": { + "type": "string", + "enum": [ + "person", + "company" + ], + "description": "Whether the party is an individual or a company." + }, + "full_name": { + "type": "string", + "maxLength": 255, + "description": "Full name of a person. Send it, or `first_name` and `last_name`." + }, + "first_name": { + "type": "string", + "maxLength": 128 + }, + "last_name": { + "type": "string", + "maxLength": 128 + }, + "role": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ], + "description": "Role the party holds. Interchangeable with `roles`; when both are sent they are merged." + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ] + }, + "description": "Every role the party holds. A person needs at least one role (here or in `role`)." + }, + "position": { + "type": "string", + "maxLength": 128, + "description": "Job title of a person." + }, + "date_of_birth": { + "type": "string", + "format": "date", + "nullable": true + }, + "company_name": { + "type": "string", + "maxLength": 255, + "description": "Name of a company party. Required when `entity_type` is `company`." + }, + "registration_number": { + "type": "string", + "maxLength": 100, + "description": "Registration number of a company party." + }, + "email": { + "type": "string", + "format": "email", + "description": "Where the verification link is sent. Required when the party has to complete verification, which depends on the role settings and ownership thresholds of the workflow." + }, + "ownership_percent": { + "type": "number", + "nullable": true, + "description": "Share of the company the party owns." + }, + "nationality": { + "type": "string", + "maxLength": 100, + "description": "Nationality of a person, or country of incorporation of a company. Required for every party." + }, + "phone_number": { + "type": "string", + "maxLength": 32 + }, + "custom_fields": { + "type": "object", + "additionalProperties": true, + "description": "Workflow-defined extra fields." + }, + "skip_verification": { + "type": "boolean", + "default": false, + "description": "Ask to skip this party's verification. Honoured only when the party's role allows skipping in the workflow's Key People settings." + } + } + } + } + } + }, + "node_id": { + "type": "string", + "nullable": true + } + } + }, + "example": { + "parties": [ + { + "draft_id": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d", + "created_at": "2026-10-31T10:00:00Z", + "updated_at": "2026-10-31T10:00:00Z", + "party": { + "entity_type": "person", + "first_name": "Ana", + "last_name": "Lopez", + "roles": [ + "ubo", + "director" + ], + "ownership_percent": 60, + "nationality": "MEX", + "email": "ana.lopez@example.com", + "date_of_birth": "1984-06-12" + } + } + ], + "node_id": "node_kyb_key_people" + } + } + } + }, + "401": { + "description": "The scoped API key has expired. This is the only case that returns `401`: a missing, invalid or revoked key returns `403`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Expired key": { + "summary": "The key's expiry date has passed", + "value": { + "detail": "This API key has expired." + } + } + } + } + } + }, + "403": { + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Missing or invalid credentials": { + "summary": "No x-api-key header, or the key failed validation", + "value": { + "detail": "Authentication credentials were not provided or are invalid." + } + }, + "Other application": { + "summary": "A valid key that belongs to a different application than the session", + "value": { + "detail": "You do not have permission to perform this action." + } + }, + "Scoped key without decisions write": { + "summary": "Scoped key lacks decisions: write", + "value": { + "detail": "This API key has no write access to decisions." + } + }, + "IP not allowed": { + "summary": "Request from outside the key's IP allowlist", + "value": { + "detail": "This API key can't be used from this IP address." + } + } + } + } + } + }, + "404": { + "description": "The session does not exist, was deleted, belongs to another application or is outside a scoped key's limits; no detail distinguishes them.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "detail": "Session not found." + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.list_kyb_party_drafts(\n \"33333333-4444-5555-6666-777777777777\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.listKybPartyDrafts(\"33333333-4444-5555-6666-777777777777\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ListKYBPartyDrafts(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsListKYBPartyDraftsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().listKybPartyDrafts(\"33333333-4444-5555-6666-777777777777\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->listKybPartyDrafts('33333333-4444-5555-6666-777777777777');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.list_kyb_party_drafts(\"33333333-4444-5555-6666-777777777777\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ListKybPartyDraftsAsync(\"33333333-4444-5555-6666-777777777777\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] + }, + "post": { + "summary": "Create a KYB party draft", + "description": "Add a party (a person or a company) to the list you are preparing for this KYB session. The same fields and rules as the hosted Key People screen apply: a person needs `full_name` or `first_name` and `last_name`, at least one role and a nationality; a company needs `company_name` and the country of incorporation in `nationality`. Nothing is declared or billed until `POST /v3/session/{sessionId}/kyb/parties/submit/`. Requires `write:businesses`.", + "operationId": "post_v3_session_kyb_party_drafts", + "x-didit-sdk": { + "resource": "sessions", + "method": "create_kyb_party_draft", + "auth": "api_key", + "server": true + }, + "tags": [ + "Sessions" + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "description": "UUID of the Business Verification (KYB) session. It must belong to the application of the API key.", + "schema": { + "type": "string", + "format": "uuid", + "example": "33333333-4444-5555-6666-777777777777" + } + }, + { + "name": "node_id", + "in": "query", + "required": false, + "description": "Workflow node of the KYB step. Only needed when the workflow has more than one KYB node; by default Didit uses the session's own node.", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "entity_type", + "nationality" + ], + "properties": { + "entity_type": { + "type": "string", + "enum": [ + "person", + "company" + ], + "description": "Whether the party is an individual or a company." + }, + "full_name": { + "type": "string", + "maxLength": 255, + "description": "Full name of a person. Send it, or `first_name` and `last_name`." + }, + "first_name": { + "type": "string", + "maxLength": 128 + }, + "last_name": { + "type": "string", + "maxLength": 128 + }, + "role": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ], + "description": "Role the party holds. Interchangeable with `roles`; when both are sent they are merged." + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ] + }, + "description": "Every role the party holds. A person needs at least one role (here or in `role`)." + }, + "position": { + "type": "string", + "maxLength": 128, + "description": "Job title of a person." + }, + "date_of_birth": { + "type": "string", + "format": "date", + "nullable": true + }, + "company_name": { + "type": "string", + "maxLength": 255, + "description": "Name of a company party. Required when `entity_type` is `company`." + }, + "registration_number": { + "type": "string", + "maxLength": 100, + "description": "Registration number of a company party." + }, + "email": { + "type": "string", + "format": "email", + "description": "Where the verification link is sent. Required when the party has to complete verification, which depends on the role settings and ownership thresholds of the workflow." + }, + "ownership_percent": { + "type": "number", + "nullable": true, + "description": "Share of the company the party owns." + }, + "nationality": { + "type": "string", + "maxLength": 100, + "description": "Nationality of a person, or country of incorporation of a company. Required for every party." + }, + "phone_number": { + "type": "string", + "maxLength": 32 + }, + "custom_fields": { + "type": "object", + "additionalProperties": true, + "description": "Workflow-defined extra fields." + }, + "skip_verification": { + "type": "boolean", + "default": false, + "description": "Ask to skip this party's verification. Honoured only when the party's role allows skipping in the workflow's Key People settings." + } + } + }, + "example": { + "entity_type": "person", + "first_name": "Ana", + "last_name": "Lopez", + "roles": [ + "ubo", + "director" + ], + "ownership_percent": 60, + "nationality": "MEX", + "email": "ana.lopez@example.com", + "date_of_birth": "1984-06-12" + } + } + } + }, + "responses": { + "201": { + "description": "Draft created.", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "draft_id", + "created_at", + "updated_at", + "party" + ], + "properties": { + "draft_id": { + "type": "string", + "format": "uuid" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "party": { + "type": "object", + "required": [ + "entity_type", + "nationality" + ], + "properties": { + "entity_type": { + "type": "string", + "enum": [ + "person", + "company" + ], + "description": "Whether the party is an individual or a company." + }, + "full_name": { + "type": "string", + "maxLength": 255, + "description": "Full name of a person. Send it, or `first_name` and `last_name`." + }, + "first_name": { + "type": "string", + "maxLength": 128 + }, + "last_name": { + "type": "string", + "maxLength": 128 + }, + "role": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ], + "description": "Role the party holds. Interchangeable with `roles`; when both are sent they are merged." + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ] + }, + "description": "Every role the party holds. A person needs at least one role (here or in `role`)." + }, + "position": { + "type": "string", + "maxLength": 128, + "description": "Job title of a person." + }, + "date_of_birth": { + "type": "string", + "format": "date", + "nullable": true + }, + "company_name": { + "type": "string", + "maxLength": 255, + "description": "Name of a company party. Required when `entity_type` is `company`." + }, + "registration_number": { + "type": "string", + "maxLength": 100, + "description": "Registration number of a company party." + }, + "email": { + "type": "string", + "format": "email", + "description": "Where the verification link is sent. Required when the party has to complete verification, which depends on the role settings and ownership thresholds of the workflow." + }, + "ownership_percent": { + "type": "number", + "nullable": true, + "description": "Share of the company the party owns." + }, + "nationality": { + "type": "string", + "maxLength": 100, + "description": "Nationality of a person, or country of incorporation of a company. Required for every party." + }, + "phone_number": { + "type": "string", + "maxLength": 32 + }, + "custom_fields": { + "type": "object", + "additionalProperties": true, + "description": "Workflow-defined extra fields." + }, + "skip_verification": { + "type": "boolean", + "default": false, + "description": "Ask to skip this party's verification. Honoured only when the party's role allows skipping in the workflow's Key People settings." + } + } + } + } + }, + "example": { + "draft_id": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d", + "created_at": "2026-10-31T10:00:00Z", + "updated_at": "2026-10-31T10:00:00Z", + "party": { + "entity_type": "person", + "first_name": "Ana", + "last_name": "Lopez", + "roles": [ + "ubo", + "director" + ], + "ownership_percent": 60, + "nationality": "MEX", + "email": "ana.lopez@example.com", + "date_of_birth": "1984-06-12" + } + } + } + } + }, + "400": { + "description": "A party field is invalid or a required one is missing.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "non_field_errors": [ + "Person parties require at least one role." + ] + } + } + } + }, + "401": { + "description": "The scoped API key has expired. This is the only case that returns `401`: a missing, invalid or revoked key returns `403`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Expired key": { + "summary": "The key's expiry date has passed", + "value": { + "detail": "This API key has expired." + } + } + } + } + } + }, + "403": { + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Missing or invalid credentials": { + "summary": "No x-api-key header, or the key failed validation", + "value": { + "detail": "Authentication credentials were not provided or are invalid." + } + }, + "Other application": { + "summary": "A valid key that belongs to a different application than the session", + "value": { + "detail": "You do not have permission to perform this action." + } + }, + "Scoped key without decisions write": { + "summary": "Scoped key lacks decisions: write", + "value": { + "detail": "This API key has no write access to decisions." + } + }, + "IP not allowed": { + "summary": "Request from outside the key's IP allowlist", + "value": { + "detail": "This API key can't be used from this IP address." + } + } + } + } + } + }, + "404": { + "description": "The session does not exist, was deleted, belongs to another application or is outside a scoped key's limits; no detail distinguishes them.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "detail": "Session not found." + } + } + } + }, + "409": { + "description": "The session is finished (`kyb_session_not_writable`).", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + }, + "code": { + "type": "string" + } + } + }, + "example": { + "detail": "This verification session is no longer accepting changes.", + "code": "kyb_session_not_writable" + } + } + } + }, + "429": { + "description": "Rate limit exceeded: 300 write (POST, PATCH, DELETE) requests per minute per API key. Wait `Retry-After` seconds before retrying; the `X-RateLimit-*` headers show the budget.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Rate limited": { + "summary": "Budget for the current minute exhausted", + "value": { + "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute." + } + } + } + } + }, + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying.", + "schema": { + "type": "integer", + "minimum": 1, + "example": 30 + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.create_kyb_party_draft(\n \"33333333-4444-5555-6666-777777777777\",\n entity_type=\"person\",\n first_name=\"Ana\",\n last_name=\"Lopez\",\n roles=[\"ubo\", \"director\"],\n date_of_birth=\"1984-06-12\",\n email=\"ana.lopez@example.com\",\n ownership_percent=60.0,\n nationality=\"MEX\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.createKybPartyDraft(\"33333333-4444-5555-6666-777777777777\", {\n entity_type: \"person\",\n first_name: \"Ana\",\n last_name: \"Lopez\",\n roles: [\"ubo\", \"director\"],\n date_of_birth: \"1984-06-12\",\n email: \"ana.lopez@example.com\",\n ownership_percent: 60.0,\n nationality: \"MEX\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.CreateKYBPartyDraft(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsCreateKYBPartyDraftParams{\n\tEntityType: \"person\",\n\tFirstName: didit.String(\"Ana\"),\n\tLastName: didit.String(\"Lopez\"),\n\tRoles: didit.Some([]didit.SessionsCreateKYBPartyDraftParamsRoles{\"ubo\", \"director\"}),\n\tDateOfBirth: didit.String(\"1984-06-12\"),\n\tEmail: didit.String(\"ana.lopez@example.com\"),\n\tOwnershipPercent: didit.Float(60.0),\n\tNationality: \"MEX\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import java.time.LocalDate;\nimport java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.SessionsCreateKybPartyDraftParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().createKybPartyDraft(\"33333333-4444-5555-6666-777777777777\", SessionsCreateKybPartyDraftParams.builder()\n .entityType(SessionsCreateKybPartyDraftParams.EntityType.of(\"person\"))\n .firstName(\"Ana\")\n .lastName(\"Lopez\")\n .roles(List.of(SessionsCreateKybPartyDraftParams.Roles.of(\"ubo\"), SessionsCreateKybPartyDraftParams.Roles.of(\"director\")))\n .dateOfBirth(LocalDate.parse(\"1984-06-12\"))\n .email(\"ana.lopez@example.com\")\n .ownershipPercent(60.0)\n .nationality(\"MEX\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->createKybPartyDraft('33333333-4444-5555-6666-777777777777', [\n 'entity_type' => 'person',\n 'first_name' => 'Ana',\n 'last_name' => 'Lopez',\n 'roles' => ['ubo', 'director'],\n 'date_of_birth' => '1984-06-12',\n 'email' => 'ana.lopez@example.com',\n 'ownership_percent' => 60.0,\n 'nationality' => 'MEX',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.create_kyb_party_draft(\n \"33333333-4444-5555-6666-777777777777\",\n entity_type: \"person\",\n first_name: \"Ana\",\n last_name: \"Lopez\",\n roles: [\"ubo\", \"director\"],\n date_of_birth: \"1984-06-12\",\n email: \"ana.lopez@example.com\",\n ownership_percent: 60.0,\n nationality: \"MEX\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.CreateKybPartyDraftAsync(\"33333333-4444-5555-6666-777777777777\", new SessionsCreateKybPartyDraftParams\n{\n EntityType = \"person\",\n FirstName = \"Ana\",\n LastName = \"Lopez\",\n Roles = new SessionsCreateKybPartyDraftParamsRoles[] { \"ubo\", \"director\" },\n DateOfBirth = \"1984-06-12\",\n Email = \"ana.lopez@example.com\",\n OwnershipPercent = 60.0,\n Nationality = \"MEX\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] + } + }, + "/v3/session/{sessionId}/kyb/parties/drafts/{draftId}/": { + "patch": { + "summary": "Edit a KYB party draft", + "description": "Change fields of one party draft. The edit is merged into the stored draft and the merged party is validated as a whole, so an edit that would leave the party incomplete is rejected. Changing `first_name` or `last_name` replaces the stored full name. Requires `write:businesses`.", + "operationId": "patch_v3_session_kyb_party_draft", + "x-didit-sdk": { + "resource": "sessions", + "method": "update_kyb_party_draft", + "auth": "api_key", + "server": true + }, + "tags": [ + "Sessions" + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "description": "UUID of the Business Verification (KYB) session. It must belong to the application of the API key.", + "schema": { + "type": "string", + "format": "uuid", + "example": "33333333-4444-5555-6666-777777777777" + } + }, + { + "name": "draftId", + "in": "path", + "required": true, + "description": "UUID of the party draft (`draft_id` returned when it was created).", + "schema": { + "type": "string", + "format": "uuid", + "example": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d" + } + }, + { + "name": "node_id", + "in": "query", + "required": false, + "description": "Workflow node of the KYB step. Only needed when the workflow has more than one KYB node; by default Didit uses the session's own node.", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "Any subset of the party fields. The edit is merged into the stored draft and the merged party is validated as a whole, so a draft that could be submitted before an edit can still be submitted after it.", + "properties": { + "entity_type": { + "type": "string", + "enum": [ + "person", + "company" + ], + "description": "Whether the party is an individual or a company." + }, + "full_name": { + "type": "string", + "maxLength": 255, + "description": "Full name of a person. Send it, or `first_name` and `last_name`." + }, + "first_name": { + "type": "string", + "maxLength": 128 + }, + "last_name": { + "type": "string", + "maxLength": 128 + }, + "role": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ], + "description": "Role the party holds. Interchangeable with `roles`; when both are sent they are merged." + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ] + }, + "description": "Every role the party holds. A person needs at least one role (here or in `role`)." + }, + "position": { + "type": "string", + "maxLength": 128, + "description": "Job title of a person." + }, + "date_of_birth": { + "type": "string", + "format": "date", + "nullable": true + }, + "company_name": { + "type": "string", + "maxLength": 255, + "description": "Name of a company party. Required when `entity_type` is `company`." + }, + "registration_number": { + "type": "string", + "maxLength": 100, + "description": "Registration number of a company party." + }, + "email": { + "type": "string", + "format": "email", + "description": "Where the verification link is sent. Required when the party has to complete verification, which depends on the role settings and ownership thresholds of the workflow." + }, + "ownership_percent": { + "type": "number", + "nullable": true, + "description": "Share of the company the party owns." + }, + "nationality": { + "type": "string", + "maxLength": 100, + "description": "Nationality of a person, or country of incorporation of a company. Required for every party." + }, + "phone_number": { + "type": "string", + "maxLength": 32 + }, + "custom_fields": { + "type": "object", + "additionalProperties": true, + "description": "Workflow-defined extra fields." + }, + "skip_verification": { + "type": "boolean", + "default": false, + "description": "Ask to skip this party's verification. Honoured only when the party's role allows skipping in the workflow's Key People settings." + } + } + }, + "example": { + "ownership_percent": 55 + } + } + } + }, + "responses": { + "200": { + "description": "Draft updated.", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "draft_id", + "created_at", + "updated_at", + "party" + ], + "properties": { + "draft_id": { + "type": "string", + "format": "uuid" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "party": { + "type": "object", + "required": [ + "entity_type", + "nationality" + ], + "properties": { + "entity_type": { + "type": "string", + "enum": [ + "person", + "company" + ], + "description": "Whether the party is an individual or a company." + }, + "full_name": { + "type": "string", + "maxLength": 255, + "description": "Full name of a person. Send it, or `first_name` and `last_name`." + }, + "first_name": { + "type": "string", + "maxLength": 128 + }, + "last_name": { + "type": "string", + "maxLength": 128 + }, + "role": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ], + "description": "Role the party holds. Interchangeable with `roles`; when both are sent they are merged." + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ] + }, + "description": "Every role the party holds. A person needs at least one role (here or in `role`)." + }, + "position": { + "type": "string", + "maxLength": 128, + "description": "Job title of a person." + }, + "date_of_birth": { + "type": "string", + "format": "date", + "nullable": true + }, + "company_name": { + "type": "string", + "maxLength": 255, + "description": "Name of a company party. Required when `entity_type` is `company`." + }, + "registration_number": { + "type": "string", + "maxLength": 100, + "description": "Registration number of a company party." + }, + "email": { + "type": "string", + "format": "email", + "description": "Where the verification link is sent. Required when the party has to complete verification, which depends on the role settings and ownership thresholds of the workflow." + }, + "ownership_percent": { + "type": "number", + "nullable": true, + "description": "Share of the company the party owns." + }, + "nationality": { + "type": "string", + "maxLength": 100, + "description": "Nationality of a person, or country of incorporation of a company. Required for every party." + }, + "phone_number": { + "type": "string", + "maxLength": 32 + }, + "custom_fields": { + "type": "object", + "additionalProperties": true, + "description": "Workflow-defined extra fields." + }, + "skip_verification": { + "type": "boolean", + "default": false, + "description": "Ask to skip this party's verification. Honoured only when the party's role allows skipping in the workflow's Key People settings." + } + } + } + } + }, + "example": { + "draft_id": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d", + "created_at": "2026-10-31T10:00:00Z", + "updated_at": "2026-10-31T10:00:00Z", + "party": { + "entity_type": "person", + "first_name": "Ana", + "last_name": "Lopez", + "roles": [ + "ubo", + "director" + ], + "ownership_percent": 55, + "nationality": "MEX", + "email": "ana.lopez@example.com", + "date_of_birth": "1984-06-12" + } + } + } + } + }, + "400": { + "description": "The merged party is invalid.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "non_field_errors": [ + "Person parties require at least one role." + ] + } + } + } + }, + "401": { + "description": "The scoped API key has expired. This is the only case that returns `401`: a missing, invalid or revoked key returns `403`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Expired key": { + "summary": "The key's expiry date has passed", + "value": { + "detail": "This API key has expired." + } + } + } + } + } + }, + "403": { + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Missing or invalid credentials": { + "summary": "No x-api-key header, or the key failed validation", + "value": { + "detail": "Authentication credentials were not provided or are invalid." + } + }, + "Other application": { + "summary": "A valid key that belongs to a different application than the session", + "value": { + "detail": "You do not have permission to perform this action." + } + }, + "Scoped key without decisions write": { + "summary": "Scoped key lacks decisions: write", + "value": { + "detail": "This API key has no write access to decisions." + } + }, + "IP not allowed": { + "summary": "Request from outside the key's IP allowlist", + "value": { + "detail": "This API key can't be used from this IP address." + } + } + } + } + } + }, + "404": { + "description": "The session or the draft does not exist, or the session is outside the key's application or a scoped key's limits.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "detail": "Session not found." + } + } + } + }, + "409": { + "description": "The session is finished (`kyb_session_not_writable`).", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + }, + "code": { + "type": "string" + } + } + }, + "example": { + "detail": "This verification session is no longer accepting changes.", + "code": "kyb_session_not_writable" + } + } + } + }, + "429": { + "description": "Rate limit exceeded: 300 write (POST, PATCH, DELETE) requests per minute per API key. Wait `Retry-After` seconds before retrying; the `X-RateLimit-*` headers show the budget.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Rate limited": { + "summary": "Budget for the current minute exhausted", + "value": { + "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute." + } + } + } + } + }, + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying.", + "schema": { + "type": "integer", + "minimum": 1, + "example": 30 + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_kyb_party_draft(\n \"33333333-4444-5555-6666-777777777777\",\n \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\",\n ownership_percent=55.0,\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateKybPartyDraft(\n \"33333333-4444-5555-6666-777777777777\",\n \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\",\n {\n ownership_percent: 55.0,\n },\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateKYBPartyDraft(ctx, \"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\", didit.SessionsUpdateKYBPartyDraftParams{\n\tOwnershipPercent: didit.Float(55.0),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateKybPartyDraftParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateKybPartyDraft(\"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\", SessionsUpdateKybPartyDraftParams.builder()\n .ownershipPercent(55.0)\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->updateKybPartyDraft('33333333-4444-5555-6666-777777777777', '5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d', [\n 'ownership_percent' => 55.0,\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_kyb_party_draft(\n \"33333333-4444-5555-6666-777777777777\",\n \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\",\n ownership_percent: 55.0\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateKybPartyDraftAsync(\"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\", new SessionsUpdateKybPartyDraftParams\n{\n OwnershipPercent = 55.0,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] + }, + "delete": { + "summary": "Delete a KYB party draft", + "description": "Drop one party draft. Declared parties are not affected. Requires `write:businesses`.", + "operationId": "delete_v3_session_kyb_party_draft", + "x-didit-sdk": { + "resource": "sessions", + "method": "delete_kyb_party_draft", + "auth": "api_key", + "server": true + }, + "tags": [ + "Sessions" + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "description": "UUID of the Business Verification (KYB) session. It must belong to the application of the API key.", + "schema": { + "type": "string", + "format": "uuid", + "example": "33333333-4444-5555-6666-777777777777" + } + }, + { + "name": "draftId", + "in": "path", + "required": true, + "description": "UUID of the party draft (`draft_id` returned when it was created).", + "schema": { + "type": "string", + "format": "uuid", + "example": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d" + } + }, + { + "name": "node_id", + "in": "query", + "required": false, + "description": "Workflow node of the KYB step. Only needed when the workflow has more than one KYB node; by default Didit uses the session's own node.", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Draft deleted. No body." + }, + "401": { + "description": "The scoped API key has expired. This is the only case that returns `401`: a missing, invalid or revoked key returns `403`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Expired key": { + "summary": "The key's expiry date has passed", + "value": { + "detail": "This API key has expired." + } + } + } + } + } + }, + "403": { + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Missing or invalid credentials": { + "summary": "No x-api-key header, or the key failed validation", + "value": { + "detail": "Authentication credentials were not provided or are invalid." + } + }, + "Other application": { + "summary": "A valid key that belongs to a different application than the session", + "value": { + "detail": "You do not have permission to perform this action." + } + }, + "Scoped key without decisions write": { + "summary": "Scoped key lacks decisions: write", + "value": { + "detail": "This API key has no write access to decisions." + } + }, + "IP not allowed": { + "summary": "Request from outside the key's IP allowlist", + "value": { + "detail": "This API key can't be used from this IP address." + } + } + } + } + } + }, + "404": { + "description": "The session or the draft does not exist, or the session is outside the key's application or a scoped key's limits.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "detail": "Session not found." + } + } + } + }, + "409": { + "description": "The session is finished (`kyb_session_not_writable`).", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + }, + "code": { + "type": "string" + } + } + }, + "example": { + "detail": "This verification session is no longer accepting changes.", + "code": "kyb_session_not_writable" + } + } + } + }, + "429": { + "description": "Rate limit exceeded: 300 write (POST, PATCH, DELETE) requests per minute per API key. Wait `Retry-After` seconds before retrying; the `X-RateLimit-*` headers show the budget.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Rate limited": { + "summary": "Budget for the current minute exhausted", + "value": { + "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute." + } + } + } + } + }, + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying.", + "schema": { + "type": "integer", + "minimum": 1, + "example": 30 + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.sessions.delete_kyb_party_draft(\n \"33333333-4444-5555-6666-777777777777\",\n \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\",\n)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.sessions.deleteKybPartyDraft(\n \"33333333-4444-5555-6666-777777777777\",\n \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\",\n);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Sessions.DeleteKYBPartyDraft(ctx, \"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\", didit.SessionsDeleteKYBPartyDraftParams{}); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().deleteKybPartyDraft(\"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\");" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->deleteKybPartyDraft('33333333-4444-5555-6666-777777777777', '5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d');" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.delete_kyb_party_draft(\n \"33333333-4444-5555-6666-777777777777\",\n \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\"\n)" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Sessions.DeleteKybPartyDraftAsync(\"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\");" + } + ] + } + }, + "/v3/session/{sessionId}/kyb/parties/submit/": { + "post": { + "summary": "Submit the KYB party drafts", + "description": "Declare the stored drafts as the company's key people. This is the hosted Key People step under your API key: Didit decides from the role settings and ownership thresholds of the workflow which parties must be verified, creates one individual KYC session (or a KYB sub-session for a corporate owner) for each of them, sends the emails the workflow asks for, and advances the session. Each child session is billed like in the hosted flow. The drafts are consumed. Repeating the call after a successful submit changes nothing and answers `200` with `already_submitted: true` and the parties that already exist. The session must be on the Key People step. Send each person's `kyc_session_url` to them, or embed it. Requires `write:businesses`.", + "operationId": "post_v3_session_kyb_parties_submit", + "x-didit-sdk": { + "resource": "sessions", + "method": "submit_kyb_parties", + "auth": "api_key", + "server": true + }, + "tags": [ + "Sessions" + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "description": "UUID of the Business Verification (KYB) session. It must belong to the application of the API key.", + "schema": { + "type": "string", + "format": "uuid", + "example": "33333333-4444-5555-6666-777777777777" + } + }, + { + "name": "node_id", + "in": "query", + "required": false, + "description": "Workflow node of the KYB step. Only needed when the workflow has more than one KYB node; by default Didit uses the session's own node.", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "locale": { + "type": "string", + "maxLength": 10, + "description": "Locale used to translate the response of the step the session advances to." + } + } + }, + "example": { + "locale": "es" + } + } + } + }, + "responses": { + "200": { + "description": "Parties declared (or already declared).", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "valid": { + "type": "boolean" + }, + "next_step": { + "type": "string", + "nullable": true, + "description": "Step the session is on." + }, + "status": { + "type": "string", + "description": "Status of the business session." + }, + "advanced": { + "type": "boolean", + "description": "`true` when this call declared the parties and advanced the session." + }, + "already_submitted": { + "type": "boolean", + "description": "`true` when the parties had been declared by an earlier call." + }, + "kyb_key_people_status": { + "type": "string" + }, + "parties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KYBKeyPeopleParty" + } + } + } + }, + "example": { + "valid": true, + "next_step": "FINISHED", + "status": "In Progress", + "advanced": true, + "already_submitted": false, + "kyb_key_people_status": "In Progress", + "parties": [] + } + } + } + }, + "402": { + "description": "The organization has no credit left for the child verification sessions.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "detail": "Insufficient credits." + } + } + } + }, + "401": { + "description": "The scoped API key has expired. This is the only case that returns `401`: a missing, invalid or revoked key returns `403`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Expired key": { + "summary": "The key's expiry date has passed", + "value": { + "detail": "This API key has expired." + } + } + } + } + } + }, + "403": { + "description": "Authentication or authorization failure. A missing key returns `403`, and so do a key of another application, a scoped key without the permission this endpoint needs, and a request from outside the key's IP allowlist; a wrong, revoked or expired key returns `401`. Distinguish them by `detail`.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Missing or invalid credentials": { + "summary": "No x-api-key header, or the key failed validation", + "value": { + "detail": "Authentication credentials were not provided or are invalid." + } + }, + "Other application": { + "summary": "A valid key that belongs to a different application than the session", + "value": { + "detail": "You do not have permission to perform this action." + } + }, + "Scoped key without decisions write": { + "summary": "Scoped key lacks decisions: write", + "value": { + "detail": "This API key has no write access to decisions." + } + }, + "IP not allowed": { + "summary": "Request from outside the key's IP allowlist", + "value": { + "detail": "This API key can't be used from this IP address." + } + } + } + } + } + }, + "404": { + "description": "The session does not exist, was deleted, belongs to another application or is outside a scoped key's limits; no detail distinguishes them.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "example": { + "detail": "Session not found." + } + } + } + }, + "409": { + "description": "`kyb_no_party_drafts`: there is nothing to submit. `kyb_parties_already_submitted`: drafts were added after the parties were declared. `kyb_step_mismatch`: the session is not on the Key People step (`next_step` names its step). `kyb_session_not_writable`: the session is finished.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + }, + "code": { + "type": "string" + }, + "next_step": { + "type": "string" + } + } + }, + "example": { + "detail": "There are no draft parties to submit.", + "code": "kyb_no_party_drafts" + } + } + } + }, + "429": { + "description": "Rate limit exceeded: 300 write (POST, PATCH, DELETE) requests per minute per API key. Wait `Retry-After` seconds before retrying; the `X-RateLimit-*` headers show the budget.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string", + "description": "Human-readable error message." + } + } + }, + "examples": { + "Rate limited": { + "summary": "Budget for the current minute exhausted", + "value": { + "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute." + } + } + } + } + }, + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying.", + "schema": { + "type": "integer", + "minimum": 1, + "example": 30 + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.submit_kyb_parties(\n \"33333333-4444-5555-6666-777777777777\",\n locale=\"es\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.submitKybParties(\"33333333-4444-5555-6666-777777777777\", {\n locale: \"es\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.SubmitKYBParties(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsSubmitKYBPartiesParams{\n\tLocale: didit.String(\"es\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.SessionsSubmitKybPartiesParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().submitKybParties(\"33333333-4444-5555-6666-777777777777\", SessionsSubmitKybPartiesParams.builder()\n .locale(\"es\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->submitKybParties('33333333-4444-5555-6666-777777777777', [\n 'locale' => 'es',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.submit_kyb_parties(\n \"33333333-4444-5555-6666-777777777777\",\n locale: \"es\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.SubmitKybPartiesAsync(\"33333333-4444-5555-6666-777777777777\", new SessionsSubmitKybPartiesParams\n{\n Locale = \"es\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] + } + }, + "/v3/session/{sessionId}/files-export/": { + "post": { + "summary": "Export every file of a session", + "description": "Start preparing one ZIP with every image, video and document of a User Verification (KYC) or Business Verification (KYB) session, in original quality: the files are stored in the ZIP as they were captured, never recompressed. Answers `202` with the export; read it with `GET /v3/session/{sessionId}/files-export/{exportId}/` until `status` is `READY`, then download `download_url`. While an export of the same session is still being prepared, that export is returned instead of a new one.\n\nThe ZIP is deleted 24 hours after it is ready, and at once when the session is deleted. A deleted session cannot be exported. Every export and every download link handed out is written to the session's audit log. A scoped API key needs `media: read` and `decisions: read`; a console user needs the privilege to read sessions.", + "operationId": "post_v3_session_files_export", + "x-didit-sdk": { + "resource": "sessions", + "method": "export_files", + "auth": "api_key", + "server": true + }, + "tags": [ + "Sessions" + ], + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "description": "UUID of the verification session (the `session_id` returned by `POST /v3/session/`). Accepts both User Verification (KYC) and Business Verification (KYB) session IDs. A deleted session returns `404`.", + "schema": { + "type": "string", + "format": "uuid", + "example": "11111111-2222-3333-4444-555555555555" + } + } + ], + "x-codeSamples": [ + { + "lang": "curl", + "label": "curl", + "source": "curl -X POST 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/files-export/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.export_files(\n \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.exportFiles(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ExportFiles(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().exportFiles(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->exportFiles('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.export_files(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ExportFilesAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ], + "responses": { + "202": { + "description": "The export, being prepared.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SessionFilesExport" + }, + "example": { + "export_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "session_id": "11111111-2222-3333-4444-555555555555", + "status": "PENDING", + "file_count": null, + "size_bytes": null, + "download_url": null, + "expires_at": null, + "error": null, + "created_at": "2026-10-29T12:00:03Z", + "completed_at": null + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ] + } + }, + "/v3/session/{sessionId}/files-export/{exportId}/": { + "get": { + "summary": "Get a session files export", + "description": "Progress of an export started with `POST /v3/session/{sessionId}/files-export/`. Once `status` is `READY`, `download_url` is a signed URL of the ZIP that stays valid for a short time; read the export again for a new one until `expires_at`. Each read that hands out a download link is written to the session's audit log. An export of a deleted session returns `404`.", + "operationId": "get_v3_session_files_export", + "x-didit-sdk": { + "resource": "sessions", + "method": "get_files_export", + "auth": "api_key", + "server": true + }, + "tags": [ + "Sessions" + ], + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "description": "UUID of the verification session (the `session_id` returned by `POST /v3/session/`). Accepts both User Verification (KYC) and Business Verification (KYB) session IDs. A deleted session returns `404`.", + "schema": { + "type": "string", + "format": "uuid", + "example": "11111111-2222-3333-4444-555555555555" + } + }, + { + "name": "exportId", + "in": "path", + "required": true, + "description": "The `export_id` returned by `POST /v3/session/{sessionId}/files-export/`.", + "schema": { + "type": "string", + "format": "uuid", + "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" + } + } + ], + "x-codeSamples": [ + { + "lang": "curl", + "label": "curl", + "source": "curl -X GET 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/files-export/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/' \\\n -H 'x-api-key: YOUR_API_KEY'" + }, + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.get_files_export(\n \"11111111-2222-3333-4444-555555555555\",\n \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.getFilesExport(\n \"11111111-2222-3333-4444-555555555555\",\n \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\n);\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.GetFilesExport(ctx, \"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().getFilesExport(\"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\");\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "sessions->getFilesExport('11111111-2222-3333-4444-555555555555', 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee');\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.get_files_export(\n \"11111111-2222-3333-4444-555555555555\",\n \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.GetFilesExportAsync(\"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\");\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ], + "responses": { + "200": { + "description": "The export.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SessionFilesExport" + }, + "example": { + "export_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "session_id": "11111111-2222-3333-4444-555555555555", + "status": "READY", + "file_count": 9, + "size_bytes": 18734120, + "download_url": "https://storage.example.com/session/11111111-2222-3333-4444-555555555555/files-export/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/session-42-files.zip?X-Amz-Signature=...", + "expires_at": "2026-10-30T12:00:41Z", + "error": null, + "created_at": "2026-10-29T12:00:03Z", + "completed_at": "2026-10-29T12:00:41Z" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ] + } + }, + "/v3/travel-rule/unmatched/": { + "get": { + "summary": "List unmatched Travel Rule deposits", + "description": "Inbound deposits that are still waiting for the originating VASP's Travel Rule data: their transfer is `AWAITING_COUNTERPARTY`, `NOT_ENOUGH_COUNTERPARTY_DATA` or `COUNTERPARTY_VASP_NOT_FOUND`, no received message is paired with them, and nobody matched them by hand. The rows and the filters are the same as in `GET /v3/travel-rule/transfers/`, newest first, paginated with `limit` (default 50) and `offset`. Pair a deposit with the message the originating VASP sent with `POST /v3/travel-rule/unmatched/{transaction_uuid}/match/`.", + "operationId": "listUnmatchedTravelRuleDeposits", + "x-didit-sdk": { + "resource": "travel_rule.unmatched_deposits", + "method": "list", + "auth": "api_key", + "server": true + }, + "tags": [ + "Travel Rule" + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "parameters": [ + { + "name": "direction", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "INBOUND, OUTBOUND, or both comma-separated. Case-sensitive." + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "One or more transfer statuses, comma-separated." + }, + { + "name": "rail", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "One or more of INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL, TEST_VASP, comma-separated." + }, + { + "name": "kind", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "withdrawal, deposit or message, comma-separated." + }, + { + "name": "currency", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "The transaction's currency, case-insensitive." + }, + { + "name": "start_date", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date" + }, + "description": "Transfers created on or after this day (UTC), YYYY-MM-DD." + }, + { + "name": "end_date", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date" + }, + "description": "Transfers created on or before this day (UTC), YYYY-MM-DD." + }, + { + "name": "counterparty", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The `id` of a directory entry or Didit network member from GET /v3/travel-rule/vasps/: your transfers with that counterparty. A value that is not a valid id answers 400." + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 1000000 + }, + "description": "Page size, default 50." + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "maximum": 1000000 + }, + "description": "Rows to skip." + } + ], + "responses": { + "200": { + "description": "A page of unmatched deposits.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "count": { + "type": "integer" + }, + "next": { + "type": "string", + "nullable": true + }, + "previous": { + "type": "string", + "nullable": true + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TravelRuleTransferRow" + } + } + } + }, + "example": { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "id": "7d3a1c55-0b9e-4d52-8a3c-1f6e2b9d4a08", + "transaction_id": "c41f9b2e-5a8d-4e0c-9f17-3b6d8a2e5c91", + "txn_id": "dep-2026-10-20-0007", + "txn_date": "2026-10-19T08:41:12Z", + "kind": "deposit", + "direction": "INBOUND", + "status": "AWAITING_COUNTERPARTY", + "rail": "TRP", + "asset": "ETH", + "amount": "1.25", + "originator_vasp": "", + "beneficiary_vasp": "Example Counterparty VASP", + "originator_wallet": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7", + "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb", + "originator_memo": "", + "beneficiary_memo": "", + "originator_wallet_type": "vasp", + "beneficiary_wallet_type": "vasp", + "matched_transaction_id": null, + "deadline_at": null, + "created_at": "2026-10-19T08:41:13Z" + } + ] + } + } + } + }, + "400": { + "description": "A filter value is not valid.", + "content": { + "application/json": { + "example": { + "start_date": [ + "Use the YYYY-MM-DD format." + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.unmatched_deposits.list():\n print(item)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.unmatchedDeposits.list()) {\n console.log(item);\n}" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.UnmatchedDeposits.ListAutoPaging(ctx, didit.TravelRuleUnmatchedDepositsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().unmatchedDeposits().list()) {\n System.out.println(item);\n}" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->unmatchedDeposits->list() as $item) {\n print_r($item->toArray());\n}" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.unmatched_deposits.list.auto_paging_each do |item|\n puts item.to_h\nend" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.UnmatchedDeposits.ListAsync())\n{\n Console.WriteLine(JsonSerializer.Serialize(item));\n}" + } + ] + } + }, + "/v3/travel-rule/unmatched/{transaction_uuid}/match/": { + "post": { + "summary": "Match a Travel Rule deposit to a received message", + "operationId": "matchUnmatchedTravelRuleDeposit", + "x-didit-sdk": { + "resource": "travel_rule.unmatched_deposits", + "method": "match", + "auth": "api_key", + "server": true + }, + "tags": [ + "Travel Rule" + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Pair an inbound deposit that is still waiting for originator data with the Travel Rule message the originating VASP sent for it. The deposit takes the message's originator data, counterparty VASP and rail, and both transfers record the match on their timelines. `transaction_uuid` is the deposit's `transaction_id` from `GET /v3/travel-rule/unmatched/`. `transaction_id` in the body is the received message's `transaction_id`, from a row of `GET /v3/travel-rule/transfers/?kind=message`; the transfer's own `id` is not found. The message must be for the same asset as the deposit. A deposit or message deleted from the Console answers `404`; one that has already moved on (matched, or no longer waiting) answers `409`.", + "parameters": [ + { + "name": "transaction_uuid", + "in": "path", + "required": true, + "description": "The `transaction_id` of the unmatched deposit.", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TravelRuleManualMatchRequest" + }, + "example": { + "transaction_id": "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24" + } + } + } + }, + "responses": { + "200": { + "description": "Both transfers after the match.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TravelRuleManualMatchResponse" + }, + "example": { + "deposit": { + "id": "7d3a1c55-0b9e-4d52-8a3c-1f6e2b9d4a08", + "transaction_id": "c41f9b2e-5a8d-4e0c-9f17-3b6d8a2e5c91", + "txn_id": "dep-2026-10-20-0007", + "txn_date": "2026-10-19T08:41:12Z", + "kind": "deposit", + "direction": "INBOUND", + "status": "AWAITING_COUNTERPARTY", + "rail": "TRP", + "asset": "ETH", + "amount": "1.25", + "originator_vasp": "Example Counterparty VASP", + "beneficiary_vasp": "Example Counterparty VASP", + "originator_wallet": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7", + "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb", + "originator_memo": "", + "beneficiary_memo": "", + "originator_wallet_type": "vasp", + "beneficiary_wallet_type": "vasp", + "matched_transaction_id": "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24", + "deadline_at": null, + "created_at": "2026-10-19T08:41:13Z" + }, + "message": { + "id": "2b8e6f10-9c3a-47d1-b5e2-0a4c7d9f3e66", + "transaction_id": "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24", + "txn_id": "msg-2026-10-20-0003", + "txn_date": "2026-10-19T08:41:12Z", + "kind": "message", + "direction": "INBOUND", + "status": "COMPLETED", + "rail": "TRP", + "asset": "ETH", + "amount": "1.25", + "originator_vasp": "Origin CASP SL", + "beneficiary_vasp": "Example Counterparty VASP", + "originator_wallet": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7", + "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb", + "originator_memo": "", + "beneficiary_memo": "", + "originator_wallet_type": "vasp", + "beneficiary_wallet_type": "vasp", + "matched_transaction_id": null, + "deadline_at": "2026-10-21T08:41:13Z", + "created_at": "2026-10-19T08:41:13Z" + } + } + } + } + }, + "400": { + "description": "Validation error: `transaction_id` is missing, is the deposit itself, is not a received Travel Rule message, or is for a different asset than the deposit; or the transaction in the path is not an inbound deposit.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string" + } + } + }, + "examples": { + "Error": { + "value": { + "transaction_id": [ + "The travel rule message is for a different asset than the deposit." + ] + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "description": "Unknown deposit or message, or one of them was deleted.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string" + } + } + }, + "example": { + "detail": "No TravelRuleTransfer matches the given query." + } + } + } + }, + "409": { + "description": "The deposit is no longer waiting for originator data, or the message is already matched to a deposit.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "detail": { + "type": "string" + } + } + }, + "examples": { + "Error": { + "value": { + "detail": "This deposit is no longer waiting for originator data." + } + } + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "python", + "label": "Python", + "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.unmatched_deposits.match(\n \"11111111-2222-3333-4444-555555555555\",\n transaction_id=\"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\",\n)\nprint(result)" + }, + { + "lang": "javascript", + "label": "Node.js", + "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.unmatchedDeposits.match(\"11111111-2222-3333-4444-555555555555\", {\n transaction_id: \"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\",\n});\nconsole.log(result);" + }, + { + "lang": "go", + "label": "Go", + "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.UnmatchedDeposits.Match(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleManualMatchRequest{\n\tTransactionID: \"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)" + }, + { + "lang": "java", + "label": "Java", + "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleManualMatchRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().unmatchedDeposits().match(\"11111111-2222-3333-4444-555555555555\", TravelRuleManualMatchRequest.builder()\n .transactionId(\"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\")\n .build());\nSystem.out.println(result);" + }, + { + "lang": "php", + "label": "PHP", + "source": "travelRule->unmatchedDeposits->match('11111111-2222-3333-4444-555555555555', [\n 'transaction_id' => 'e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24',\n]);\nprint_r($result->toArray());" + }, + { + "lang": "ruby", + "label": "Ruby", + "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.unmatched_deposits.match(\n \"11111111-2222-3333-4444-555555555555\",\n transaction_id: \"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\"\n)\nputs result.to_h" + }, + { + "lang": "csharp", + "label": ".NET", + "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.UnmatchedDeposits.MatchAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleManualMatchRequest\n{\n TransactionId = \"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));" + } + ] + } } }, "components": { @@ -75786,6 +91970,7 @@ "transaction.status.updated", "travel_rule.status.updated", "workflow.compliance_changed", + "transaction_rule_suggestions.created", "auth.signup", "auth.login", "auth.login_failed", @@ -76071,6 +92256,14 @@ }, "phone_social": { "$ref": "#/components/schemas/PhoneSocialFootprint" + }, + "phone_intelligence": { + "allOf": [ + { + "$ref": "#/components/schemas/PhoneIntelligence" + } + ], + "description": "Phone intelligence signals. Present only when `enable_enrichment` was `true` on the check." } } }, @@ -76356,6 +92549,14 @@ }, "email_social": { "$ref": "#/components/schemas/EmailSocialFootprint" + }, + "email_intelligence": { + "allOf": [ + { + "$ref": "#/components/schemas/EmailIntelligence" + } + ], + "description": "Email intelligence signals. Present only when `enable_enrichment` was `true` on the check." } } }, @@ -76678,7 +92879,7 @@ }, "config": { "type": "object", - "description": "Feature-specific settings. For `QUESTIONNAIRE`, include `questionnaire_uuid` with the `questionnaire_id` returned by the questionnaire create endpoint. For `OCR`, `methods` selects which ID Verification methods each country may use (document capture, non-doc lookup against a government or other authoritative source, and digital identity wallets); omit it and every country is document capture only. For `SIGNATURE`, see [Electronic Signature settings](/management-api/workflows/feature-configs#electronic-signature): `signature_level` accepts `aes` only for now, and workflow documents and their fields are managed in the console, so through the API send documents and fields per session with `signature_documents_source: \"session\"`.", + "description": "Feature-specific settings. For `QUESTIONNAIRE`, include `questionnaire_uuid` with the `questionnaire_id` returned by the questionnaire create endpoint. For `SIGNATURE`, a workflow that goes live needs a document to sign: set `signature_documents_source` to `session` or `both` so each session can bring its own, or send `status: \"draft\"` and add the documents before you publish. `signature_level: \"aes\"` is refused with `aes_not_available` while `signature_availability.aes` is `false` on the workflow. For `OCR`, `methods` selects which ID Verification methods each country may use (document capture, non-doc lookup against a government or other authoritative source, and digital identity wallets); omit it and every country is document capture only. For `SIGNATURE`, see [E-signature settings](/management-api/workflows/feature-configs#e-signature): `signature_level` accepts `simple` (the default, no ID verification, email or phone needed) and `aes` for now, and workflow documents and their fields are managed in the console, so through the API send documents and fields per session with `signature_documents_source: \"session\"`.", "additionalProperties": true }, "label": { @@ -78280,7 +94481,7 @@ } } }, - "description": "Alerts raised by rules and providers." + "description": "Always empty today. An open alert is a transaction with status `IN_REVIEW` or `AWAITING_USER`." }, "rule_runs": { "type": "array", @@ -81951,7 +98152,7 @@ "description": "Comparison operator. in/not_in test membership (value may be a list or a single scalar). contains/not_contains are case-insensitive substring checks against a string value. contains_any takes a list of strings and matches when any is a case-insensitive substring of the field value. regex matches the value pattern against the field. fuzzy_match compares against the value string with the required `score` threshold (0-100). gt/gte/lt/lte never match when either side is missing. exists/is_not_empty/is_not_null (aliases) and not_exists/is_empty/is_null (aliases) are presence checks that ignore `value`." }, "value": { - "description": "Comparison value. Its shape depends on the operator and value_type; omit for the presence-check operators." + "description": "Comparison value. Its shape depends on the operator and value_type; omit it for the presence-check operators. Every other operator needs a value that is not `null` or an empty list, otherwise the rule is refused with `400`. `contains_any` needs a list of strings, and `contains`, `not_contains` and `regex` need a single string." }, "value_type": { "type": "string", @@ -83964,9 +100165,36 @@ "reason_codes": { "type": "array", "items": { - "type": "string" + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "Stable Didit identifier of the signal, for example `IR-5AC67A32`. Opaque: group and filter on it, do not parse it." + }, + "value": { + "nullable": true, + "description": "For a risk flag (for example `voip`, `leaked`, `disposable`, `spam_trap`), its value: a boolean, a level or a date. Null for a scored reason code." + }, + "direction": { + "type": "string", + "enum": [ + "risk", + "trust" + ], + "description": "Whether the signal raised the risk or added trust." + }, + "message": { + "type": "string", + "description": "Human-readable explanation of the signal, in English." + }, + "impact_level": { + "type": "string", + "nullable": true, + "description": "How strongly the signal moved the score, for example `low`, `medium` or `high`." + } + } }, - "description": "Machine-readable codes explaining the score. Values can grow over time, so do not reject unknown codes." + "description": "Signals that explain the score, each with a stable Didit code, a direction, a message and an impact level. New codes can appear over time, so do not reject unknown codes." } } }, @@ -84027,9 +100255,36 @@ "reason_codes": { "type": "array", "items": { - "type": "string" + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "Stable Didit identifier of the signal, for example `IR-5AC67A32`. Opaque: group and filter on it, do not parse it." + }, + "value": { + "nullable": true, + "description": "For a risk flag (for example `voip`, `leaked`, `disposable`, `spam_trap`), its value: a boolean, a level or a date. Null for a scored reason code." + }, + "direction": { + "type": "string", + "enum": [ + "risk", + "trust" + ], + "description": "Whether the signal raised the risk or added trust." + }, + "message": { + "type": "string", + "description": "Human-readable explanation of the signal, in English." + }, + "impact_level": { + "type": "string", + "nullable": true, + "description": "How strongly the signal moved the score, for example `low`, `medium` or `high`." + } + } }, - "description": "Machine-readable codes explaining the score. Values can grow over time, so do not reject unknown codes." + "description": "Signals that explain the score, each with a stable Didit code, a direction, a message and an impact level. New codes can appear over time, so do not reject unknown codes." } } }, @@ -85170,6 +101425,456 @@ "unresolved" ] }, + "KYBRegistryData": { + "type": "object", + "nullable": true, + "description": "Didit's normalized registry detail for the company: the ownership outcome (`ownership_error`, `section_errors`, `ubo_resolution`, `lite_enrichment`), the corrections made with update-data, and registry facts that have no field of their own. It never carries the registry source's own record. Every key is optional and present only when the company has a value for it; new keys may be added. Read the canonical fields (`addresses`, `industries`, `ownership`, `beneficial_owners[].shareholding`) for anything they cover.", + "properties": { + "company_name": { + "type": "string", + "description": "Company name as corrected in the console." + }, + "registration_number": { + "type": "string", + "description": "Registration number as the registry or a console correction states it." + }, + "country_code": { + "type": "string", + "description": "Country of the registration as the registry or a console correction states it." + }, + "region": { + "type": "string", + "description": "Region or state of the registration." + }, + "incorporation_date": { + "type": "string", + "description": "Incorporation date (ISO 8601)." + }, + "registration_date": { + "type": "string", + "description": "Registration date (ISO 8601) when the registry states one apart from the incorporation date." + }, + "dissolution_date": { + "type": "string", + "description": "Dissolution date (ISO 8601) when the registry states one." + }, + "tax_number": { + "type": "string", + "description": "Tax identification number." + }, + "vat_number": { + "type": "string", + "description": "VAT number." + }, + "legal_address": { + "type": "string", + "description": "Legal address as corrected in the console." + }, + "registered_address": { + "type": "string", + "description": "Registered address as the registry states it." + }, + "company_type": { + "type": "string", + "description": "Legal form." + }, + "registry_status": { + "type": "string", + "description": "Company status at the registry." + }, + "verification_status": { + "type": "string", + "description": "Verification status." + }, + "alternative_names": { + "type": "string", + "description": "Other names the company trades or traded under." + }, + "nature_of_business": { + "type": "string", + "description": "Activity description." + }, + "registered_capital": { + "type": "string", + "description": "Registered capital as printed." + }, + "registered_capital_amount": { + "type": "string", + "description": "Registered capital amount, as a decimal string." + }, + "registered_capital_currency": { + "type": "string", + "description": "Registered capital currency (ISO 4217)." + }, + "website": { + "type": "string", + "description": "Website." + }, + "email": { + "type": "string", + "description": "Contact email." + }, + "phone": { + "type": "string", + "description": "Contact phone." + }, + "legal_entity_identifier": { + "type": "string", + "description": "Legal Entity Identifier (LEI)." + }, + "location_of_registration": { + "type": "string", + "description": "Place of registration." + }, + "control_scheme": { + "type": "string", + "description": "Governance scheme when the registry exposes it." + }, + "ownership_error": { + "type": "string", + "enum": [ + "no_owners_on_record", + "no_natural_person_owner", + "ownership_section_unavailable", + "company_not_found", + "ambiguous_company_match", + "missing_registration_number", + "entity_type_not_covered", + "provider_unavailable", + "other" + ], + "description": "Why a requested ownership tier was not delivered, in the same codes as `ownership.unavailable_reason`. `no_owners_on_record` (the registry answered and names no owner) and `ownership_section_unavailable` (the registry did not return the ownership section) are different findings." + }, + "section_errors": { + "type": "object", + "description": "Sections the registry did not return, keyed by section (`officers`, `shareholders`, `group_structure`). A section listed here was never delivered: an empty list next to it says nothing about the company.", + "additionalProperties": { + "$ref": "#/components/schemas/KYBRegistrySectionError" + } + }, + "ubo_resolution": { + "$ref": "#/components/schemas/KYBRegistryUboResolution" + }, + "lite_enrichment": { + "$ref": "#/components/schemas/KYBRegistryLiteEnrichment" + }, + "registry_metadata": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "description": "The register's own fields for the company, keyed as the register names them, as plain values (legacy records). Only fields reviewed as registry facts are included." + }, + "registry_sources": { + "type": "array", + "description": "The official registers the record was read from (legacy records). Other sources are not named.", + "items": { + "$ref": "#/components/schemas/KYBRegistrySource" + } + }, + "previous_names": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Names the company was registered under before (legacy records)." + }, + "parent_companies": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Parent companies the registry names (legacy records)." + }, + "documents_available": { + "type": "integer", + "description": "How many filings the registry offers for the company (legacy records)." + } + } + }, + "KYBRegistryGroupCompany": { + "type": "object", + "description": "A company of the corporate group, by its registry identity.", + "properties": { + "name": { + "type": "string", + "nullable": true, + "description": "Company name." + }, + "country_code": { + "type": "string", + "nullable": true, + "description": "Country of registration." + }, + "registration_number": { + "type": "string", + "nullable": true, + "description": "Registration number." + } + }, + "required": [ + "name", + "country_code", + "registration_number" + ] + }, + "KYBRegistryUboResolution": { + "type": "object", + "description": "How the UBO tier walked the ownership chain above the company.", + "properties": { + "parent_chain": { + "type": "array", + "description": "Corporate parents from the ultimate parent down to the company.", + "items": { + "$ref": "#/components/schemas/KYBRegistryGroupCompany" + } + }, + "subsidiaries": { + "type": "array", + "description": "Companies directly below the company in its corporate group.", + "items": { + "$ref": "#/components/schemas/KYBRegistryGroupCompany" + } + }, + "unresolved": { + "type": "array", + "description": "Parts of the chain the registry could not resolve (the same entries as `ownership.unresolved`).", + "items": { + "type": "object", + "properties": { + "reason": { + "type": "string", + "description": "Why, for example `no_group_structure_on_record`, `selected_company_not_in_group_structure` or `section_error`." + }, + "section": { + "type": "string", + "nullable": true, + "description": "The section concerned, for example `group_structure`." + } + }, + "required": [ + "reason", + "section" + ] + } + } + }, + "required": [ + "parent_chain", + "subsidiaries", + "unresolved" + ] + }, + "KYBRegistrySectionError": { + "type": "object", + "description": "A section the registry did not return.", + "properties": { + "status_code": { + "type": "integer", + "nullable": true, + "description": "The status the registry answered for the section." + } + }, + "required": [ + "status_code" + ] + }, + "KYBRegistryLiteEnrichment": { + "type": "object", + "description": "Blank Lite profile fields another of the country's registry sources filled. The source is not named.", + "properties": { + "fields": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The company fields that were filled." + }, + "people_added": { + "type": "integer", + "description": "How many officers or owners were added." + } + }, + "required": [ + "fields", + "people_added" + ] + }, + "KYBRegistrySource": { + "type": "object", + "description": "An official register the record was read from. Only official government registers, regulators and the official identifier system are named; any other source is left out.", + "properties": { + "name": { + "type": "string", + "description": "Register name, for example `UK Companies House`." + }, + "source_type": { + "type": "string", + "enum": [ + "official" + ], + "description": "Always `official`." + } + }, + "required": [ + "name", + "source_type" + ] + }, + "KYBOwnershipStructure": { + "type": "object", + "nullable": true, + "description": "The cap table the registry proved, as it stood when the ownership tier was delivered: direct `shareholders` and `beneficial_owners`. Null when the registry proved no ownership. It never carries the registry source's own rows; read `company.beneficial_owners` and `company.ownership` for the current record.", + "properties": { + "shareholders": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KYBOwnershipStructureOwner" + } + }, + "beneficial_owners": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KYBOwnershipStructureOwner" + } + } + }, + "required": [ + "shareholders", + "beneficial_owners" + ] + }, + "KYBOwnershipStructureOwner": { + "type": "object", + "description": "One owner of the ownership snapshot: the same registry identity and stake as `company.beneficial_owners[]`, and its canonical `shareholding`.", + "properties": { + "name": { + "type": "string", + "nullable": true, + "description": "Owner name as the registry states it." + }, + "first_name": { + "type": "string", + "nullable": true, + "description": "Given name, for a natural person, when the registry states it." + }, + "last_name": { + "type": "string", + "nullable": true, + "description": "Family name, for a natural person, when the registry states it." + }, + "date_of_birth": { + "type": "string", + "nullable": true, + "description": "Date of birth (ISO 8601) when the registry publishes it." + }, + "country_of_birth": { + "type": "string", + "nullable": true, + "description": "Country of birth when the registry publishes it." + }, + "company_name": { + "type": "string", + "nullable": true, + "description": "Company name, for a corporate owner." + }, + "registration_number": { + "type": "string", + "nullable": true, + "description": "Registration number, for a corporate owner." + }, + "entity_type": { + "type": "string", + "nullable": true, + "enum": [ + "person", + "company", + null + ], + "description": "Whether the owner is a natural person or a company." + }, + "nationality": { + "type": "string", + "nullable": true, + "description": "Nationality when the registry states it." + }, + "designation": { + "type": "string", + "nullable": true, + "description": "The owner's title or role as the registry prints it." + }, + "roles": { + "type": "array", + "items": { + "type": "string" + }, + "description": "`shareholder` for a direct holder, `ubo` for a beneficial owner." + }, + "ownership_min_shares": { + "type": "string", + "nullable": true, + "description": "Lower bound of the stake, in percent (equal to the upper bound for an exact stake)." + }, + "ownership_max_shares": { + "type": "string", + "nullable": true, + "description": "Upper bound of the stake, in percent." + }, + "voting_min_shares": { + "type": "string", + "nullable": true, + "description": "Lower bound of the voting rights, in percent." + }, + "voting_max_shares": { + "type": "string", + "nullable": true, + "description": "Upper bound of the voting rights, in percent." + }, + "appointment_date": { + "type": "string", + "nullable": true, + "description": "Date the holding or appointment started (ISO 8601)." + }, + "is_active": { + "type": "boolean", + "nullable": true, + "description": "False for a former owner." + }, + "shareholding": { + "$ref": "#/components/schemas/KYBRegistryShareholding" + } + }, + "required": [ + "name", + "first_name", + "last_name", + "date_of_birth", + "country_of_birth", + "company_name", + "registration_number", + "entity_type", + "nationality", + "designation", + "roles", + "ownership_min_shares", + "ownership_max_shares", + "voting_min_shares", + "voting_max_shares", + "appointment_date", + "is_active", + "shareholding" + ] + }, "DigitalIdWalletApiWalletVerificationError": { "type": "object", "properties": { @@ -85410,13 +102115,21 @@ "$ref": "#/components/schemas/DigitalIdWalletApiWalletNextActionTypeEnum" } ], - "description": "redirect: send the user's browser to url. confirm_in_app: show verification_code to the user, who checks it matches the code in their wallet app and confirms there; then poll.\n\n* `redirect` - redirect\n* `confirm_in_app` - confirm_in_app" + "description": "redirect: send the user's browser to url. confirm_in_app: show verification_code to the user, who checks it matches the code in their wallet app and confirms there; then poll. request_digital_credential: in a user gesture on the origin you started with, ask the wallet with digital_credentials.request, then send what it returns to POST .../verifications/{request_id}/response/.\n\n* `redirect` - redirect\n* `confirm_in_app` - confirm_in_app\n* `request_digital_credential` - request_digital_credential" }, "url": { "type": "string", "format": "uri", "description": "redirect only: where the user signs in with the wallet." }, + "digital_credentials": { + "allOf": [ + { + "$ref": "#/components/schemas/DigitalIdWalletApiWalletDigitalCredentialsRequest" + } + ], + "description": "request_digital_credential only: the request to hand to the wallet." + }, "verification_code": { "type": "string", "description": "confirm_in_app only: the 4-digit comparison code the wallet app shows too." @@ -85433,18 +102146,20 @@ "DigitalIdWalletApiWalletNextActionTypeEnum": { "enum": [ "redirect", - "confirm_in_app" + "confirm_in_app", + "request_digital_credential" ], "type": "string", - "description": "* `redirect` - redirect\n* `confirm_in_app` - confirm_in_app" + "description": "* `redirect` - redirect\n* `confirm_in_app` - confirm_in_app\n* `request_digital_credential` - request_digital_credential" }, "DigitalIdWalletApiInteractionEnum": { "enum": [ "redirect", - "in_app" + "in_app", + "digital_credentials" ], "type": "string", - "description": "* `redirect` - redirect\n* `in_app` - in_app" + "description": "* `redirect` - redirect\n* `in_app` - in_app\n* `digital_credentials` - digital_credentials" }, "DigitalIdWalletApiWalletVerificationResultOutcomeEnum": { "enum": [ @@ -89802,7 +106517,7 @@ }, "SignatureResult": { "type": "object", - "description": "One signer's result for one Electronic Signature step. See the [Electronic Signature report](/core-technology/electronic-signature/report-electronic-signature).", + "description": "One signer's result for one E-signature step. See the [E-signature report](/core-technology/electronic-signature/report-electronic-signature).", "properties": { "id": { "type": "string", @@ -89838,21 +106553,24 @@ "level": { "type": "string", "enum": [ + "simple", "aes", "qes" ], - "description": "`aes`. `qes` (Qualified Electronic Signature, QES) is coming soon." + "description": "`simple` (default) or `aes`. `qes` (Qualified Electronic Signature, QES) is an add-on that is not available yet." }, "format": { "type": "string", "enum": [ + "pdf", "pades" - ] + ], + "description": "`pdf` for a Simple signature, `pades` for Advanced (AES)." }, "profile": { "type": "string", "nullable": true, - "description": "`PAdES-B-LT` once signed." + "description": "`PAdES-B-LT` once an Advanced (AES) signature is signed, otherwise null." }, "signer": { "type": "object", @@ -89860,7 +106578,7 @@ "name": { "type": "string", "nullable": true, - "description": "Verified name." + "description": "The signer's name. Verified (from the approved ID verification or the session) except at the Simple level without a verified session name, where it is the name the signer typed and is not verified." }, "capacity": { "type": "string", @@ -89894,6 +106612,7 @@ }, "identity_used": { "type": "object", + "description": "The verified identity the signature relies on. Empty for a Simple signature with no verified identity.", "properties": { "session_id": { "type": "string", @@ -89917,7 +106636,7 @@ "certificate": { "type": "object", "nullable": true, - "description": "The certificate the documents were signed with. `null` until signed.", + "description": "The certificate the documents were signed with. `null` until signed, and always `null` for a Simple signature.", "properties": { "issuer": { "type": "string" @@ -89944,10 +106663,12 @@ "properties": { "channel": { "type": "string", + "nullable": true, "enum": [ "email", "sms" - ] + ], + "description": "`null` for a Simple signature, which has no code." }, "destination": { "type": "string", @@ -89968,7 +106689,7 @@ "timestamp": { "type": "object", "nullable": true, - "description": "The trusted timestamp in the signature. `null` until signed.", + "description": "The RFC 3161 timestamp in the signature, issued by Didit. `null` until signed, and always `null` for a Simple signature.", "properties": { "time": { "type": "string", @@ -90150,7 +106871,7 @@ }, "warnings": { "type": "array", - "description": "Warnings raised for this signer. See [Electronic Signature warnings](/core-technology/electronic-signature/warnings-electronic-signature).", + "description": "Warnings raised for this signer. See [E-signature warnings](/core-technology/electronic-signature/warnings-electronic-signature).", "items": { "type": "object", "properties": { @@ -90232,7 +106953,7 @@ "certificate": { "type": "object", "nullable": true, - "description": "The certificate the documents were signed with. `null` until signed.", + "description": "The certificate the documents were signed with. `null` until signed, and always `null` for a Simple signature.", "properties": { "issuer": { "type": "string" @@ -90257,7 +106978,7 @@ "timestamp": { "type": "object", "nullable": true, - "description": "The trusted timestamp in the signature. `null` until signed.", + "description": "The RFC 3161 timestamp in the signature, issued by Didit. `null` until signed, and always `null` for a Simple signature.", "properties": { "time": { "type": "string", @@ -91747,6 +108468,11 @@ "nullable": true, "description": "For a session cloned with `POST /v3/session/import-shared/`: the `session_id` of the original session in the source application. `null` for every other session. Omitted when `include=events` is passed." }, + "shared_from_session_number": { + "type": "integer", + "nullable": true, + "description": "`session_number` of the source session when this session was imported from another application of your organization. `null` otherwise." + }, "session_number": { "type": "integer", "description": "The number of the session.", @@ -91774,6 +108500,213 @@ ], "description": "Overall lifecycle status of the session — the rolled-up workflow result. Terminal values are `Approved`, `Declined`, `In Review`, `Expired`, `Kyc Expired`, and `Abandoned`; `Not Started`, `In Progress`, `Awaiting User`, and `Resubmitted` indicate the session is still moving through the workflow." }, + "status_override": { + "type": "object", + "nullable": true, + "description": "Present when a reviewer set `status` by hand. `null` when the status is the automatic one. Use it to tell a manual approval from an automatic one.", + "properties": { + "overridden_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "automatic_status": { + "type": "string", + "nullable": true, + "description": "The status the platform's own checks conclude." + } + } + }, + "decision_trace": { + "type": "object", + "description": "How the status was reached: who set it and which warnings did.", + "properties": { + "status": { + "type": "string", + "description": "The session status." + }, + "decided_by": { + "type": "string", + "nullable": true, + "enum": [ + "manual", + "automatic", + "investigator", + null + ], + "description": "Who set the status. `null` while the session is not decided." + }, + "decided_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "automatic_status": { + "type": "string", + "nullable": true, + "description": "What the platform's own checks conclude, which differs from `status` after a manual decision." + }, + "terminal_node_id": { + "type": "string", + "nullable": true, + "description": "The workflow status node that ended the session, when one did." + }, + "actor": { + "type": "object", + "nullable": true, + "description": "The reviewer behind a manual decision.", + "properties": { + "user": { + "type": "string", + "nullable": true + }, + "actor_type": { + "type": "string", + "nullable": true + } + } + }, + "warning_counts": { + "type": "object", + "description": "Warnings per `log_type` (`error`, `warning`, `information`) and `total`.", + "additionalProperties": { + "type": "integer" + } + }, + "status_warnings": { + "type": "array", + "description": "The warnings that set a `Declined` or `In Review` status.", + "items": { + "type": "object", + "properties": { + "risk": { + "type": "string" + }, + "feature": { + "type": "string", + "nullable": true + }, + "node_id": { + "type": "string", + "nullable": true + }, + "log_type": { + "type": "string", + "nullable": true + }, + "check_status": { + "type": "string", + "nullable": true + }, + "source": { + "type": "string", + "description": "The payload list the warning came from, for example `id_verifications`." + }, + "short_description": { + "type": "string", + "nullable": true + } + } + } + } + } + }, + "linked_records": { + "type": "object", + "nullable": true, + "description": "A summary of other records linked to the session. `null` when there is nothing to show, and for workflows that declare an age assurance standard.", + "properties": { + "same_face": { + "type": "object", + "nullable": true, + "description": "Other people whose face matched one of this session's face searches.", + "properties": { + "count": { + "type": "integer" + }, + "best_match": { + "type": "object", + "nullable": true, + "properties": { + "session_id": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "session_number": { + "type": "integer", + "nullable": true + }, + "vendor_user_id": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "similarity_percentage": { + "type": "number", + "nullable": true + } + } + } + } + }, + "earlier_verifications": { + "type": "object", + "nullable": true, + "properties": { + "count": { + "type": "integer" + }, + "vendor_user_id": { + "type": "string", + "format": "uuid", + "nullable": true + } + } + }, + "networks": { + "type": "object", + "nullable": true, + "properties": { + "count": { + "type": "integer" + }, + "open": { + "type": "integer" + }, + "dismissed": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "network_id": { + "type": "string", + "format": "uuid" + }, + "display_number": { + "type": "integer", + "nullable": true + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "risk_score": { + "type": "number", + "nullable": true + } + } + } + } + } + } + } + }, "workflow_id": { "type": "string", "format": "uuid", @@ -91786,7 +108719,7 @@ "type": "string", "description": "The feature of the session." }, - "description": "List of verification features configured for this session, as display names: `ID_VERIFICATION`, `NFC`, `LIVENESS`, `FACE_MATCH`, `POA`, `PHONE`, `EMAIL_VERIFICATION`, `AML`, `IP_ANALYSIS`, `DATABASE_VALIDATION`, `QUESTIONNAIRE`, `AGE_ESTIMATION`, `FACE_SEARCH` (Business Verification sessions use the KYB feature set: `KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE`, `AML`, `PHONE`, `EMAIL_VERIFICATION`, `IP_ANALYSIS`, `QUESTIONNAIRE`). With `include=events` each entry becomes an object `{feature, node_id}` instead of a plain string, and the email feature is renamed: it appears as `EMAIL` in events mode instead of the `EMAIL_VERIFICATION` used here." + "description": "List of verification features configured for this session, as display names: `ID_VERIFICATION`, `NFC`, `LIVENESS`, `FACE_MATCH`, `POA`, `PHONE`, `EMAIL_VERIFICATION`, `AML`, `IP_ANALYSIS`, `DATABASE_VALIDATION`, `QUESTIONNAIRE`, `AGE_ESTIMATION`, `FACE_SEARCH`, `GEOLOCATION` (Location verification) (Business Verification sessions use the KYB feature set: `KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE`, `AML`, `PHONE`, `EMAIL_VERIFICATION`, `IP_ANALYSIS`, `QUESTIONNAIRE`). With `include=events` each entry becomes an object `{feature, node_id}` instead of a plain string, and the email feature is renamed: it appears as `EMAIL` in events mode instead of the `EMAIL_VERIFICATION` used here." }, "vendor_data": { "type": "string", @@ -92810,7 +109743,9 @@ "DOCUMENT_AI", "KYB_REGISTRY", "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE" + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" ], "description": "The feature that generated this warning (e.g., `ID_VERIFICATION`, `NFC`, `LIVENESS`). The value identifies the feature block the warning belongs to. Each module's warnings array typically uses the value matching its module, but the enum above is authoritative across all feature warnings on the decision payload." }, @@ -93045,6 +109980,25 @@ ], "nullable": true, "description": "Address Validation of the address printed on this document: whether it exists and its normalised form, as the document read it (a later correction of `address` does not run it again). Present when this ID verification step enabled the Address Validation add-on; `null` otherwise." + }, + "region": { + "type": "string", + "nullable": true, + "description": "Region or state of the document's issuing country where the document identifies one." + }, + "extracted_data": { + "type": "object", + "nullable": true, + "additionalProperties": true, + "description": "Snapshot of the data extracted from the document that the person was shown to review, kept next to the confirmed values so you can compare what was read with what the person confirmed. `null` when the person was not asked to review." + }, + "barcodes": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + }, + "description": "Data read from the document's barcodes. Empty when the document has none or none was read." } } } @@ -93389,7 +110343,9 @@ "DOCUMENT_AI", "KYB_REGISTRY", "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE" + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" ], "description": "The feature that generated this warning. The value identifies the feature block the warning belongs to. Each module's warnings array typically uses the value matching its module (e.g. `PHONE` inside `phone_verifications[].warnings`), but the enum above is authoritative across all feature warnings on the decision payload." }, @@ -93585,7 +110541,9 @@ "DOCUMENT_AI", "KYB_REGISTRY", "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE" + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" ], "description": "The feature that generated this warning. The value identifies the feature block the warning belongs to. Each module's warnings array typically uses the value matching its module (e.g. `PHONE` inside `phone_verifications[].warnings`), but the enum above is authoritative across all feature warnings on the decision payload." }, @@ -93690,7 +110648,9 @@ "DOCUMENT_AI", "KYB_REGISTRY", "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE" + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" ], "description": "The feature that generated this warning. The value identifies the feature block the warning belongs to. Each module's warnings array typically uses the value matching its module (e.g. `PHONE` inside `phone_verifications[].warnings`), but the enum above is authoritative across all feature warnings on the decision payload." }, @@ -93717,6 +110677,67 @@ } }, "description": "Face match verification warnings" + }, + "face_coverage": { + "type": "object", + "nullable": true, + "description": "Whether the eyes, mouth and face are covered in the captured image. Returned by `GET /v3/session/{sessionId}/decision/` only; it is not part of webhook payloads. `null` when no coverage reading exists.", + "properties": { + "eyes": { + "type": "object", + "properties": { + "covered": { + "type": "boolean", + "nullable": true + }, + "calibrated": { + "type": "boolean", + "nullable": true, + "description": "`false` means the reading is shadow evidence only and no warning acts on it." + }, + "visibility_score": { + "type": "number", + "nullable": true + } + } + }, + "mouth": { + "type": "object", + "properties": { + "covered": { + "type": "boolean", + "nullable": true + }, + "calibrated": { + "type": "boolean", + "nullable": true, + "description": "`false` means the reading is shadow evidence only and no warning acts on it." + }, + "visibility_score": { + "type": "number", + "nullable": true + } + } + }, + "face": { + "type": "object", + "properties": { + "covered": { + "type": "boolean", + "nullable": true + }, + "calibrated": { + "type": "boolean", + "nullable": true, + "description": "`false` means the reading is shadow evidence only and no warning acts on it." + }, + "visibility_score": { + "type": "number", + "nullable": true + } + } + } + } } } } @@ -93864,7 +110885,9 @@ "DOCUMENT_AI", "KYB_REGISTRY", "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE" + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" ], "description": "The feature that generated this warning. The value identifies the feature block the warning belongs to. Each module's warnings array typically uses the value matching its module (e.g. `PHONE` inside `phone_verifications[].warnings`), but the enum above is authoritative across all feature warnings on the decision payload." }, @@ -93939,6 +110962,22 @@ } } } + }, + "phone_intelligence": { + "allOf": [ + { + "$ref": "#/components/schemas/PhoneIntelligence" + } + ], + "description": "Phone intelligence signals. Present only when the phone intelligence add-on ran for this number." + }, + "phone_social": { + "allOf": [ + { + "$ref": "#/components/schemas/PhoneSocialFootprint" + } + ], + "description": "Social footprint of the number. Present only when the social footprint add-on ran for this number." } } } @@ -94058,7 +111097,9 @@ "DOCUMENT_AI", "KYB_REGISTRY", "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE" + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" ], "description": "The feature that generated this warning. The value identifies the feature block the warning belongs to. Each module's warnings array typically uses the value matching its module (e.g. `PHONE` inside `phone_verifications[].warnings`), but the enum above is authoritative across all feature warnings on the decision payload." }, @@ -94170,6 +111211,22 @@ } } } + }, + "email_intelligence": { + "allOf": [ + { + "$ref": "#/components/schemas/EmailIntelligence" + } + ], + "description": "Email intelligence signals. Present only when the email intelligence add-on ran for this address." + }, + "email_social": { + "allOf": [ + { + "$ref": "#/components/schemas/EmailSocialFootprint" + } + ], + "description": "Social footprint of the address. Present only when the social footprint add-on ran for this address." } } } @@ -94523,7 +111580,9 @@ "DOCUMENT_AI", "KYB_REGISTRY", "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE" + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" ], "description": "The feature that generated this warning. The value identifies the feature block the warning belongs to. Each module's warnings array typically uses the value matching its module (e.g. `PHONE` inside `phone_verifications[].warnings`), but the enum above is authoritative across all feature warnings on the decision payload." }, @@ -94905,14 +111964,14 @@ "bank_verifications": { "type": "array", "nullable": true, - "description": "Bank Verification results, one item per Bank Verification step, for User and Business Verification. `null` until a step produces one. Each item's `method` says how the account was verified: `open_banking` (bank sign-in) or `account_lookup` (account check), or a `statement` or `microdeposits` fallback, and `none` when the person continued without a bank before any attempt was evaluated (`continued_without_bank`). See [Bank verification methods](/core-technology/bank-verification/verification-methods).", + "description": "Bank Verification results, one item per Bank Verification step, for User and Business Verification. `null` until a step produces one. Each item's `method` says how the account was verified: `open_banking` (bank sign-in) or `account_lookup` (account check), or a `statement` or `microdeposits` fallback, and `none` when the person continued without a bank before any attempt was evaluated (`continued_without_bank`). See [Bank verification methods](/core-technology/bank-verification/verification-methods). Bank Verification is not enabled in production yet, so this stays `null` on production sessions until it is.", "items": { "$ref": "#/components/schemas/BankVerificationResult" } }, "signatures": { "type": "array", - "description": "Electronic Signature results, one item per signer and signature step, for User and Business Verification. Present only when the workflow has an Electronic Signature step; an empty array until a signer reaches it. See the [Electronic Signature report](/core-technology/electronic-signature/report-electronic-signature).", + "description": "E-signature results, one item per signer and signature step, for User and Business Verification. Present only when the workflow has an E-signature step; an empty array until a signer reaches it. See the [E-signature report](/core-technology/electronic-signature/report-electronic-signature).", "items": { "$ref": "#/components/schemas/SignatureResult" } @@ -95141,7 +112200,9 @@ "DOCUMENT_AI", "KYB_REGISTRY", "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE" + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" ], "description": "The feature that generated this warning. The value identifies the feature block the warning belongs to. Each module's warnings array typically uses the value matching its module (e.g. `PHONE` inside `phone_verifications[].warnings`), but the enum above is authoritative across all feature warnings on the decision payload." }, @@ -95329,10 +112390,65 @@ } } } + }, + "browser_version": { + "type": "string", + "nullable": true + }, + "os_version": { + "type": "string", + "nullable": true + }, + "user_agent": { + "type": "string", + "nullable": true, + "description": "The browser's user agent string." + }, + "accept_language": { + "type": "string", + "nullable": true, + "description": "The `Accept-Language` header the browser sent." + }, + "session_identifier": { + "type": "string", + "nullable": true, + "description": "Identifier of the browsing session the verification ran in." + }, + "session_age_ms": { + "type": "integer", + "nullable": true, + "description": "Age of that browsing session in milliseconds when the step ran." + }, + "coords_accuracy": { + "type": "number", + "nullable": true, + "description": "Accuracy radius, in metres, of the coordinates the device reported." + }, + "raw_device_data": { + "type": "object", + "nullable": true, + "additionalProperties": true, + "description": "Raw device signals collected for the step." } } } }, + "geolocation_checks": { + "type": "array", + "nullable": true, + "description": "**Array of Location verification results**, one per Location verification step: that step's accepted attempt. `null` until a Location verification step has produced data. Earlier attempts of the same step are in `geolocation_attempts`.", + "items": { + "$ref": "#/components/schemas/GeolocationCheck" + } + }, + "geolocation_attempts": { + "type": "array", + "nullable": true, + "description": "Every attempt of every Location verification step of this session, oldest first. Attempts that a resubmission replaced are left out. A workflow that withholds `geolocation_checks` through its response attributes withholds this list too.", + "items": { + "$ref": "#/components/schemas/GeolocationAttempt" + } + }, "database_validations": { "type": "array", "nullable": true, @@ -95505,7 +112621,9 @@ "DOCUMENT_AI", "KYB_REGISTRY", "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE" + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" ], "description": "The feature that generated this warning. The value identifies the feature block the warning belongs to. Each module's warnings array typically uses the value matching its module (e.g. `PHONE` inside `phone_verifications[].warnings`), but the enum above is authoritative across all feature warnings on the decision payload." }, @@ -95536,6 +112654,22 @@ } } }, + "database_validation_not_performed_reason": { + "type": "object", + "nullable": true, + "additionalProperties": true, + "description": "Why a configured database validation produced no result, as `{code, message}` plus context fields. Present only when `database_validations` is `null` for a workflow that has the step, so you can tell \"the registry agreed\" from \"nothing ran\". `null` otherwise.", + "properties": { + "code": { + "type": "string", + "description": "Stable machine-readable reason." + }, + "message": { + "type": "string", + "description": "Human-readable explanation." + } + } + }, "reviews": { "type": "array", "items": { @@ -95558,6 +112692,34 @@ } } }, + "assignee": { + "type": "object", + "nullable": true, + "description": "The Console reviewer the session is assigned to, or `null` when nobody holds it.", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "assigned_at": { + "type": "string", + "format": "date-time", + "nullable": true + } + } + }, + "waiting_since": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the session started waiting for review. `null` unless the session is `In Review` and your application sets a review deadline." + }, + "sla_due_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the review is due. `null` unless the session is `In Review` and your application sets a review deadline." + }, "created_at": { "type": "string", "format": "date-time", @@ -95996,8 +113158,7 @@ "description": "Registry filing dates, when available. Annual returns and general meetings use last_annual_return_date and last_agm_date; they are distinct from financial accounts." }, "registry_data": { - "type": "object", - "description": "Raw record returned by the registry source, kept for reviewers. Its shape differs by country and source and is not a stable contract: read the canonical fields (`addresses`, `industries`, `ownership`, `beneficial_owners[].shareholding`) instead." + "$ref": "#/components/schemas/KYBRegistryData" }, "user_provided_data": { "type": "object", @@ -96033,12 +113194,60 @@ "type": "string", "nullable": true, "description": "`not_requested`, `pending`, `delivered`, `not_held` or `unavailable`. Also in `ownership.status`." + }, + "registry_monitoring": { + "type": "object", + "nullable": true, + "description": "The latest registry monitor for the company, or `null` when none exists.", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "status": { + "type": "string" + }, + "unavailable_reason": { + "type": "string", + "nullable": true + }, + "enrolled_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "cancelled_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "last_bill_date": { + "type": "string", + "format": "date", + "nullable": true + }, + "next_bill_date": { + "type": "string", + "format": "date", + "nullable": true + }, + "last_event_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "events_count": { + "type": "integer" + }, + "watched_fields": { + "description": "The company fields the monitor watches." + } + } } } }, "ownership_structure": { - "type": "object", - "description": "Raw ownership snapshot kept for reviewers; its shape differs by registry source and is not a stable contract. Read `company.beneficial_owners` and `company.ownership` instead." + "$ref": "#/components/schemas/KYBOwnershipStructure" }, "warnings": { "type": "array", @@ -97136,6 +114345,11 @@ ], "description": "Whether the session was created by a live application (`live`) or a sandbox application (`sandbox`). Sandbox sessions are free, fully simulated, and never bill credits." }, + "sandbox_scenario": { + "type": "string", + "nullable": true, + "description": "The sandbox scenario the session was created with. `null` for live sessions and for sandbox sessions created without one." + }, "resubmissions": { "type": "array", "description": "Returned only with `include=resubmissions`, for user and business sessions. One entry per resubmission request, oldest first. Each entry carries the results the resubmitted steps returned before the request, so earlier submissions stay readable. Deleting the session deletes every submission.", @@ -97371,6 +114585,27 @@ }, "investigator": { "$ref": "#/components/schemas/InvestigatorBlock" + }, + "biometric_retention": { + "$ref": "#/components/schemas/BiometricRetention" + }, + "fraud_check": { + "type": "object", + "nullable": true, + "additionalProperties": true, + "description": "The result of a Fraud Check API call. `null` for every other session." + }, + "full_session_video": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "Expiring URL of the full-session recording. Returned only when your organization records full-session video." + }, + "full_session_video_recorded_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the full-session recording was made. Returned only when your organization records full-session video." } } }, @@ -97513,6 +114748,24 @@ "type": "string", "format": "date-time" }, + "signature_availability": { + "type": "object", + "description": "Which E-signature levels can sign right now. Check it before you set `signature_level`. Returned on `kyc`, `kyb` and graph workflows.", + "properties": { + "simple": { + "type": "boolean", + "description": "Simple is always available." + }, + "aes": { + "type": "boolean", + "description": "Whether Advanced (AES) can sign now. While it is `false`, saving a new step at `signature_level: \"aes\"` is refused with `aes_not_available`." + }, + "qes": { + "type": "boolean", + "description": "Whether Qualified (QES) can sign now. It is `false` until a qualified provider is connected." + } + } + }, "is_bank_verification_enabled": { "type": "boolean", "description": "Whether a simple KYC or KYB workflow runs Bank verification. It runs after the contact steps (and Location verification) and before database validation, AML and IP analysis. Bank verification is not generally available yet: turning it on is refused wherever it is not enabled." @@ -97676,7 +114929,8 @@ "AML", "IP_ANALYSIS", "AGE_ESTIMATION", - "DATABASE_VALIDATION" + "DATABASE_VALIDATION", + "GEOLOCATION" ], "description": "Verification feature identifier.", "example": "ID_VERIFICATION" @@ -97904,6 +115158,63 @@ } } } + }, + "assignee": { + "type": "object", + "nullable": true, + "description": "The Console reviewer the session is assigned to, or `null` when nobody holds it.", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "assigned_at": { + "type": "string", + "format": "date-time", + "nullable": true + } + } + }, + "waiting_since": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the session started waiting for review. `null` unless the session is `In Review`." + }, + "sla_due_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the review is due, from the review deadline set for your application in the Console. `null` unless the session is `In Review` and a deadline is set." + }, + "top_warnings": { + "type": "array", + "description": "Up to a few of the session's most important warnings, for a quick triage view. The full list is in the decision.", + "items": { + "type": "object", + "properties": { + "risk": { + "type": "string", + "description": "Warning code, for example `FACE_MATCH_LOW_SIMILARITY`." + }, + "feature": { + "type": "string", + "description": "The feature that raised it." + }, + "log_type": { + "type": "string", + "nullable": true, + "description": "`error` or `warning`; `null` for a legacy entry." + }, + "short_description": { + "type": "string" + } + } + } + }, + "warnings_count": { + "type": "integer", + "description": "Number of warnings on the session." } } }, @@ -98328,8 +115639,8 @@ "properties": { "kyb_response_id": { "type": "string", - "maxLength": 255, - "description": "Candidate handle from `POST /v3/kyb/search/` (`kyb_registry.companies[].kyb_response_id`). Ephemeral — use it shortly after the search that produced it.", + "maxLength": 1024, + "description": "Candidate handle from `POST /v3/kyb/search/` (`kyb_registry.companies[].kyb_response_id`). Ephemeral: use it shortly after the search that produced it. Handles can be long, so store and send the value exactly as returned, without trimming or assuming a length.", "example": "69aeeb95febb0f1704042259" }, "vendor_data": { @@ -98435,7 +115746,7 @@ }, "trigger": { "type": "string", - "description": "Present when the event was not produced by the verification flow itself, for example `manual_review`, `manual_step_update`, `ongoing_monitoring`, `webhook_reconciliation`, `manual_webhook_recovery`, `kyb_registry_change` or a `console_*` edit." + "description": "Present when the event was not produced by the verification flow itself, for example `manual_review`, `manual_step_update`, `ongoing_monitoring`, `webhook_reconciliation` (a `status.updated` resent because the first terminal webhook was never created, so you may receive a second event for a decision you already got: deduplicate on `session_id` and `status`), `manual_webhook_recovery`, `kyb_registry_change`, `biometric_retention` (a `data.updated` sent when the session's live biometric data is deleted on schedule) or a `console_*` edit such as `console_registry_edit`, `console_key_people_skip` or `console_key_people_regenerate`." }, "workflow_id": { "type": "string", @@ -99267,6 +116578,9 @@ }, { "$ref": "#/components/schemas/WorkflowComplianceChangedEvent" + }, + { + "$ref": "#/components/schemas/TransactionRuleSuggestionsCreatedEvent" } ], "discriminator": { @@ -99281,7 +116595,8 @@ "transaction.created": "#/components/schemas/TransactionCreatedEvent", "transaction.status.updated": "#/components/schemas/TransactionStatusUpdatedEvent", "travel_rule.status.updated": "#/components/schemas/TravelRuleStatusUpdatedEvent", - "workflow.compliance_changed": "#/components/schemas/WorkflowComplianceChangedEvent" + "workflow.compliance_changed": "#/components/schemas/WorkflowComplianceChangedEvent", + "transaction_rule_suggestions.created": "#/components/schemas/TransactionRuleSuggestionsCreatedEvent" } } }, @@ -99383,7 +116698,7 @@ "properties": { "id": { "type": "string", - "description": "Unique identifier of the match" + "description": "Didit's stable identifier for the hit: `hit_` followed by 24 hexadecimal characters. The same matched entity keeps the same `id` when the subject is screened again. Pass it as `hit_id` to the AML hit review endpoints." }, "url": { "type": "string", @@ -99428,10 +116743,11 @@ "Fitness and Probity", "SIP", "SIE", - "Insolvency" + "Insolvency", + "Other Lists" ] }, - "description": "List of dataset categories where the match was found. Indicates whether the entity appeared in PEP lists (with level), sanctions databases, adverse media, warnings/regulatory enforcement, or other compliance datasets." + "description": "List of dataset categories where the match was found. Indicates whether the entity appeared in PEP lists (with level), sanctions databases, adverse media, warnings/regulatory enforcement, or other compliance datasets. `Other Lists` when the entity's source states none of these categories." }, "features": { "type": "object", @@ -100160,7 +117476,9 @@ "DOCUMENT_AI", "KYB_REGISTRY", "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE" + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" ], "description": "The feature that generated this warning. The value identifies the feature block the warning belongs to. Within an AML screening this is typically `AML`, but the enum above is authoritative across all feature warnings on the decision payload." }, @@ -101723,7135 +119041,8215 @@ "format": "date-time", "description": "When Didit recorded it." }, - "score": { + "score": { + "type": "integer", + "description": "Risk score. Higher is riskier." + }, + "severity": { + "type": "string", + "nullable": true, + "enum": [ + "UNKNOWN", + "LOW", + "MEDIUM", + "HIGH", + "CRITICAL", + null + ], + "description": "Risk severity, `null` until something sets it." + }, + "decision_reason_code": { + "type": "string", + "nullable": true, + "description": "Machine-readable reason for the current `status`." + }, + "decision_reason_label": { + "type": "string", + "nullable": true, + "description": "Human-readable label for `decision_reason_code`." + }, + "tags": { + "type": "array", + "description": "Tags on the transaction.", + "items": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "color": { + "type": "string", + "description": "Hex color, for example `#F59E0B`." + }, + "description": { + "type": "string", + "nullable": true + }, + "source": { + "type": "string", + "enum": [ + "didit", + "custom" + ], + "description": "Didit preset or custom tag." + } + } + } + }, + "subject_name": { + "type": "string", + "nullable": true, + "description": "Full name of the `APPLICANT` party." + }, + "subject_vendor_data": { + "type": "string", + "nullable": true, + "description": "Your `vendor_data` for the applicant." + }, + "subject_type": { + "type": "string", + "nullable": true, + "enum": [ + "user", + "business", + null + ], + "description": "Whether the applicant is linked to a Didit user or business; `null` when it is linked to neither." + }, + "subject_uuid": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "UUID of the Didit user or business the applicant is linked to." + }, + "subject_country": { + "type": "string", + "nullable": true, + "description": "Country code of the applicant." + }, + "counterparty_name": { + "type": "string", + "nullable": true, + "description": "Full name of the `COUNTERPARTY` party, if any." + }, + "counterparty_vendor_data": { + "type": "string", + "nullable": true, + "description": "Your `vendor_data` for the counterparty." + }, + "counterparty_country": { + "type": "string", + "nullable": true, + "description": "Country code of the counterparty." + }, + "assigned_to_name": { + "type": "string", + "nullable": true, + "description": "Name of the Console reviewer assigned to the transaction." + }, + "travel_rule_status": { + "type": "string", + "nullable": true, + "description": "Status of the transaction's Travel Rule transfer, or `null` when it has none." + }, + "application_id": { + "type": "string", + "format": "uuid", + "description": "Application that owns the transaction." + }, + "application_name": { + "type": "string", + "nullable": true, + "description": "Name of that application." + }, + "organization_id": { + "type": "string", + "format": "uuid", + "description": "Organization that owns the application." + }, + "organization_name": { + "type": "string", + "nullable": true, + "description": "Name of that organization." + } + } + }, + "ApplicationAnalyticsDataPoint": { + "type": "object", + "description": "Session counts for one day, by creation date (UTC). Each count reflects the session's current status. Points of the previous period carry at least the required fields.", + "required": [ + "rounded_date", + "total", + "approved", + "declined", + "canceled", + "pending" + ], + "properties": { + "rounded_date": { + "type": "string", + "format": "date", + "description": "The day, `YYYY-MM-DD`." + }, + "total": { + "type": "integer", + "description": "Sessions created that day." + }, + "approved": { + "type": "integer", + "description": "Of those, sessions `Approved` or `Kyc Expired`." + }, + "declined": { + "type": "integer", + "description": "Sessions `Declined`." + }, + "canceled": { + "type": "integer", + "description": "Sessions `Expired` or `Abandoned`." + }, + "pending": { + "type": "integer", + "description": "Sessions `Not Started`, `In Progress` or `In Review`." + }, + "in_review": { + "type": "integer", + "description": "Sessions `In Review`." + }, + "expired": { + "type": "integer", + "description": "Sessions `Expired`." + }, + "abandoned": { + "type": "integer", + "description": "Sessions `Abandoned`." + }, + "in_progress": { + "type": "integer", + "description": "Sessions `In Progress`." + }, + "not_started": { + "type": "integer", + "description": "Sessions `Not Started`." + }, + "manually_approved": { + "type": "integer", + "description": "Sessions a reviewer approved after the workflow gave another verdict." + }, + "manually_declined": { + "type": "integer", + "description": "Sessions a reviewer declined after the workflow gave another verdict." + } + } + }, + "ApplicationAnalyticsRequestBreakdown": { + "type": "object", + "description": "Status totals for the range. The previous-period breakdown carries at least the required fields.", + "required": [ + "total_approved", + "total_in_review", + "total_declined", + "total_canceled", + "total_pending" + ], + "properties": { + "total_approved": { + "type": "integer", + "description": "Sessions `Approved` or `Kyc Expired`." + }, + "total_in_review": { + "type": "integer", + "description": "Sessions `In Review`." + }, + "total_declined": { + "type": "integer", + "description": "Sessions `Declined`." + }, + "total_canceled": { + "type": "integer", + "description": "Sessions `Expired` or `Abandoned`." + }, + "total_pending": { + "type": "integer", + "description": "Sessions `Not Started`, `In Progress` or `In Review` (includes `total_in_review`)." + }, + "total_expired": { + "type": "integer", + "description": "Sessions `Expired`." + }, + "total_abandoned": { + "type": "integer", + "description": "Sessions `Abandoned`." + }, + "total_in_progress": { + "type": "integer", + "description": "Sessions `In Progress`." + }, + "total_not_started": { + "type": "integer", + "description": "Sessions `Not Started`." + }, + "total_manually_approved": { + "type": "integer", + "description": "Approved by a reviewer." + }, + "total_manually_declined": { + "type": "integer", + "description": "Declined by a reviewer." + } + } + }, + "ApplicationAnalyticsCountryCount": { + "type": "object", + "properties": { + "country": { + "type": "string", + "description": "Country name." + }, + "country_code": { + "type": "string", + "description": "Two-letter country code." + }, + "session_count": { + "type": "integer", + "description": "Sessions from that country." + } + } + }, + "ApplicationAnalyticsLocationStats": { + "type": "object", + "properties": { + "ip_countries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsCountryCount" + }, + "description": "Countries of the users' IP addresses, most sessions first." + }, + "countries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsCountryCount" + }, + "description": "Same list as `ip_countries`." + }, + "id_countries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsCountryCount" + }, + "description": "Issuing countries of the verified ID documents, most sessions first." + }, + "conversion_by_country": { + "type": "array", + "description": "Per document issuing country: finished sessions (approved, declined or in review) and how many were approved. Most finished first.", + "items": { + "type": "object", + "properties": { + "country": { + "type": "string" + }, + "country_code": { + "type": "string" + }, + "finished": { + "type": "integer" + }, + "approved": { + "type": "integer" + } + } + } + }, + "cities": { + "type": "array", + "description": "Up to 100 IP cities, most sessions first.", + "items": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "`City, Country`." + }, + "session_count": { + "type": "integer" + }, + "latitude": { + "type": "number", + "nullable": true + }, + "longitude": { + "type": "number", + "nullable": true + } + } + } + } + } + }, + "ApplicationAnalyticsDemographicStats": { + "type": "object", + "properties": { + "age_distribution": { + "type": "object", + "description": "Sessions per age band from the ID document. Empty when there is no data.", + "properties": { + "under_18": { + "type": "integer" + }, + "18_24": { + "type": "integer" + }, + "25_34": { + "type": "integer" + }, + "35_44": { + "type": "integer" + }, + "45_64": { + "type": "integer" + }, + "65_plus": { + "type": "integer" + } + }, + "additionalProperties": { + "type": "integer" + } + }, + "gender_distribution": { + "type": "object", + "description": "Sessions per document gender code: `M`, `F` or `U` (unknown).", + "additionalProperties": { + "type": "integer" + } + } + } + }, + "ApplicationAnalyticsDeviceDetails": { + "type": "object", + "description": "Top five of each, most sessions first.", + "properties": { + "device_models": { + "type": "array", + "description": "Device brands: `Apple`, `Android`, `LG`, everything else grouped as `Other`.", + "items": { + "type": "object", + "properties": { + "device": { + "type": "string" + }, + "count": { + "type": "integer" + } + } + } + }, + "browsers": { + "type": "array", + "description": "Browsers: `Chrome`, `Safari`, `Didit App`, `Firefox`, everything else grouped as `Other`.", + "items": { + "type": "object", + "properties": { + "browser": { + "type": "string" + }, + "count": { + "type": "integer" + } + } + } + }, + "operating_systems": { + "type": "array", + "description": "Operating systems.", + "items": { + "type": "object", + "properties": { + "os": { + "type": "string" + }, + "count": { + "type": "integer" + } + } + } + } + } + }, + "ApplicationAnalyticsWorkflowFunnel": { + "type": "object", + "description": "Keyed by workflow ID. `total` is the sessions started on that workflow; `steps` counts the sessions that reached each step (`OCR`, `LIVENESS`, `FACE_MATCH`, `AML`, `POA`, `PHONE`, `EMAIL`, `NFC`, `DATABASE_VALIDATION`, `QUESTIONNAIRE`, `IP_ANALYSIS`, `AGE_ESTIMATION`, `KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE`). Reaching a step is not passing it.", + "additionalProperties": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "steps": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "reached": { + "type": "integer" + } + } + } + } + } + } + }, + "ApplicationAnalyticsVerificationTimeStats": { + "type": "object", + "description": "Active time users spent verifying, ignoring idle gaps. An empty object when there is no data.", + "properties": { + "overall_avg_seconds": { + "type": "number", + "description": "Average per session, one decimal." + }, + "overall_count": { + "type": "integer", + "description": "Sessions measured." + }, + "per_feature": { + "type": "object", + "description": "Keyed by feature, for example `OCR` or `LIVENESS`.", + "additionalProperties": { + "type": "object", + "properties": { + "avg_seconds": { + "type": "number" + }, + "total_seconds": { + "type": "number" + }, + "count": { + "type": "integer" + } + } + } + }, + "per_sub_step": { + "type": "object", + "description": "Keyed by feature, then by sub-step, for example `front_id_photo`.", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "avg_seconds": { + "type": "number" + }, + "total_seconds": { + "type": "number" + }, + "count": { + "type": "integer" + } + } + } + } + } + } + }, + "ApplicationAnalyticsResubmissionStats": { + "type": "object", + "properties": { + "first_pass": { + "type": "integer", + "description": "Finished sessions with no resubmission." + }, + "second": { "type": "integer", - "description": "Risk score. Higher is riskier." + "description": "Finished sessions resubmitted once." }, - "severity": { - "type": "string", - "nullable": true, - "enum": [ - "UNKNOWN", - "LOW", - "MEDIUM", - "HIGH", - "CRITICAL", - null - ], - "description": "Risk severity, `null` until something sets it." + "third_plus": { + "type": "integer", + "description": "Finished sessions resubmitted two or more times." }, - "decision_reason_code": { - "type": "string", - "nullable": true, - "description": "Machine-readable reason for the current `status`." + "abandoned": { + "type": "integer", + "description": "Abandoned sessions." + } + } + }, + "ApplicationAnalyticsOriginalStatusStats": { + "type": "object", + "description": "The workflow's automatic verdict, before any reviewer changed it.", + "properties": { + "approved": { + "type": "integer" }, - "decision_reason_label": { - "type": "string", - "nullable": true, - "description": "Human-readable label for `decision_reason_code`." + "in_review": { + "type": "integer" }, - "tags": { - "type": "array", - "description": "Tags on the transaction.", - "items": { + "declined": { + "type": "integer" + } + } + }, + "ApplicationAnalyticsWarningStats": { + "type": "object", + "description": "Keyed by feature (`ID_VERIFICATION`, `LIVENESS`, `FACEMATCH`, `AML`, `PROOF_OF_ADDRESS`, `PHONE`, `EMAIL`, `NFC`, `LOCATION`, `DATABASE_VALIDATION`, `QUESTIONNAIRE` and the KYB features). `total` is the sessions that reached the feature; `risks` counts sessions per warning code and level.", + "additionalProperties": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "risks": { "type": "object", - "properties": { - "uuid": { - "type": "string", - "format": "uuid" - }, - "name": { - "type": "string" - }, - "color": { - "type": "string", - "description": "Hex color, for example `#F59E0B`." - }, - "description": { - "type": "string", - "nullable": true - }, - "source": { - "type": "string", - "enum": [ - "didit", - "custom" - ], - "description": "Didit preset or custom tag." + "additionalProperties": { + "type": "object", + "properties": { + "error": { + "type": "integer" + }, + "warning": { + "type": "integer" + }, + "information": { + "type": "integer" + } } } } - }, - "subject_name": { + } + } + }, + "ApplicationAnalyticsDemographicPoint": { + "type": "object", + "properties": { + "date": { "type": "string", - "nullable": true, - "description": "Full name of the `APPLICANT` party." + "description": "Period key: `YYYY-MM-DD` for a day, the Monday of a week, or `YYYY-MM` for a month, following `grouping_mode`." }, - "subject_vendor_data": { - "type": "string", - "nullable": true, - "description": "Your `vendor_data` for the applicant." + "age_distribution": { + "type": "object", + "additionalProperties": { + "type": "integer" + } }, - "subject_type": { + "gender_distribution": { + "type": "object", + "additionalProperties": { + "type": "integer" + } + } + } + }, + "ApplicationAnalyticsDevicePoint": { + "type": "object", + "properties": { + "date": { "type": "string", - "nullable": true, - "enum": [ - "user", - "business", - null - ], - "description": "Whether the applicant is linked to a Didit user or business; `null` when it is linked to neither." + "description": "Period key: `YYYY-MM-DD` for a day, the Monday of a week, or `YYYY-MM` for a month, following `grouping_mode`." }, - "subject_uuid": { - "type": "string", - "format": "uuid", - "nullable": true, - "description": "UUID of the Didit user or business the applicant is linked to." + "devices": { + "type": "object", + "additionalProperties": { + "type": "integer" + } }, - "subject_country": { - "type": "string", - "nullable": true, - "description": "Country code of the applicant." + "browsers": { + "type": "object", + "additionalProperties": { + "type": "integer" + } }, - "counterparty_name": { + "operating_systems": { + "type": "object", + "additionalProperties": { + "type": "integer" + } + } + } + }, + "ApplicationAnalyticsVerificationTimePoint": { + "type": "object", + "properties": { + "date": { "type": "string", - "nullable": true, - "description": "Full name of the `COUNTERPARTY` party, if any." + "description": "Period key: `YYYY-MM-DD` for a day, the Monday of a week, or `YYYY-MM` for a month, following `grouping_mode`." }, - "counterparty_vendor_data": { - "type": "string", - "nullable": true, - "description": "Your `vendor_data` for the counterparty." + "overall_avg": { + "type": "number", + "description": "Average active seconds per session." }, - "counterparty_country": { + "per_feature": { + "type": "object", + "description": "Average active seconds per feature.", + "additionalProperties": { + "type": "number" + } + } + } + }, + "ApplicationAnalyticsResubmissionPoint": { + "type": "object", + "properties": { + "date": { "type": "string", - "nullable": true, - "description": "Country code of the counterparty." + "description": "Period key: `YYYY-MM-DD` for a day, the Monday of a week, or `YYYY-MM` for a month, following `grouping_mode`." }, - "assigned_to_name": { - "type": "string", - "nullable": true, - "description": "Name of the Console reviewer assigned to the transaction." + "first_pass": { + "type": "integer" }, - "travel_rule_status": { - "type": "string", - "nullable": true, - "description": "Status of the transaction's Travel Rule transfer, or `null` when it has none." + "second": { + "type": "integer" }, - "application_id": { - "type": "string", - "format": "uuid", - "description": "Application that owns the transaction." + "third_plus": { + "type": "integer" }, - "application_name": { + "abandoned": { + "type": "integer" + } + } + }, + "ApplicationAnalyticsOriginalStatusPoint": { + "type": "object", + "properties": { + "date": { "type": "string", - "nullable": true, - "description": "Name of that application." + "description": "Period key: `YYYY-MM-DD` for a day, the Monday of a week, or `YYYY-MM` for a month, following `grouping_mode`." }, - "organization_id": { - "type": "string", - "format": "uuid", - "description": "Organization that owns the application." + "approved": { + "type": "integer" }, - "organization_name": { - "type": "string", - "nullable": true, - "description": "Name of that organization." + "in_review": { + "type": "integer" + }, + "declined": { + "type": "integer" } } }, - "ApplicationAnalyticsDataPoint": { + "ApplicationAnalyticsSummary": { "type": "object", - "description": "Session counts for one day, by creation date (UTC). Each count reflects the session's current status. Points of the previous period carry at least the required fields.", + "description": "User verification (KYC) summary, returned when neither `scope` nor `widget_keys` is sent.", "required": [ - "rounded_date", - "total", - "approved", - "declined", - "canceled", - "pending" + "data_points", + "request_breakdown", + "previous_data_points", + "previous_request_breakdown", + "conversion_rate", + "location_stats", + "demographic_stats", + "device_details", + "workflow_funnel_stats", + "verification_time_stats", + "resubmission_stats", + "warning_stats", + "original_status_stats", + "grouping_mode", + "demographic_time_series", + "device_time_series", + "verification_time_time_series", + "resubmission_time_series", + "original_status_time_series" ], "properties": { - "rounded_date": { - "type": "string", - "format": "date", - "description": "The day, `YYYY-MM-DD`." + "data_points": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint" + }, + "description": "One point per day, from the first day with sessions in the range to `end_date`. Always daily, whatever `grouping_mode` says." }, - "total": { - "type": "integer", - "description": "Sessions created that day." + "request_breakdown": { + "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown" }, - "approved": { - "type": "integer", - "description": "Of those, sessions `Approved` or `Kyc Expired`." + "previous_data_points": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint" + }, + "description": "Daily points for the period of the same length right before `start_date`." }, - "declined": { - "type": "integer", - "description": "Sessions `Declined`." + "previous_request_breakdown": { + "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown" }, - "canceled": { - "type": "integer", - "description": "Sessions `Expired` or `Abandoned`." + "conversion_rate": { + "type": "number", + "nullable": true, + "description": "`total_approved / (total_approved + total_declined + total_in_review) x 100`, one decimal. `null` when nothing finished." }, - "pending": { - "type": "integer", - "description": "Sessions `Not Started`, `In Progress` or `In Review`." + "location_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsLocationStats" }, - "in_review": { - "type": "integer", - "description": "Sessions `In Review`." + "demographic_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsDemographicStats" }, - "expired": { - "type": "integer", - "description": "Sessions `Expired`." + "device_details": { + "$ref": "#/components/schemas/ApplicationAnalyticsDeviceDetails" }, - "abandoned": { - "type": "integer", - "description": "Sessions `Abandoned`." + "workflow_funnel_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsWorkflowFunnel" }, - "in_progress": { - "type": "integer", - "description": "Sessions `In Progress`." + "verification_time_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimeStats" }, - "not_started": { - "type": "integer", - "description": "Sessions `Not Started`." + "resubmission_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionStats" }, - "manually_approved": { - "type": "integer", - "description": "Sessions a reviewer approved after the workflow gave another verdict." + "warning_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsWarningStats" }, - "manually_declined": { - "type": "integer", - "description": "Sessions a reviewer declined after the workflow gave another verdict." + "original_status_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusStats" + }, + "grouping_mode": { + "type": "string", + "enum": [ + "day", + "week", + "month" + ], + "description": "How the `*_time_series` lists are grouped: `day` for up to 14 days, `week` up to 90, `month` beyond. Measured from the first day with sessions in the range." + }, + "demographic_time_series": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsDemographicPoint" + } + }, + "device_time_series": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsDevicePoint" + } + }, + "verification_time_time_series": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimePoint" + } + }, + "resubmission_time_series": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionPoint" + } + }, + "original_status_time_series": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusPoint" + } } } }, - "ApplicationAnalyticsRequestBreakdown": { + "ApplicationAnalyticsWidget": { "type": "object", - "description": "Status totals for the range. The previous-period breakdown carries at least the required fields.", + "description": "One dashboard widget. Every widget has `kind` and `title`; the other fields depend on `kind`. The session widgets reuse the summary objects (`data_points`, `request_breakdown`, `workflow_funnel_stats` and so on); list widgets put their entries in `items`; transaction metrics use `value`.", "required": [ - "total_approved", - "total_in_review", - "total_declined", - "total_canceled", - "total_pending" + "kind", + "title" ], "properties": { - "total_approved": { - "type": "integer", - "description": "Sessions `Approved` or `Kyc Expired`." + "kind": { + "type": "string", + "enum": [ + "sessions_volume", + "workflow_funnel", + "average_verification_time", + "country_distribution", + "warning_insights", + "conversion_rate", + "conversion_by_country", + "resubmission_insights", + "original_status_distribution", + "database_validation_coverage", + "database_validation_latency", + "demographics", + "device_details", + "horizontal_bar", + "kyb_registry_coverage", + "kyb_registry_data_completeness", + "metric", + "time_series", + "breakdown", + "status_time_series", + "leaderboard", + "histogram" + ], + "description": "Widget type." }, - "total_in_review": { - "type": "integer", - "description": "Sessions `In Review`." + "title": { + "type": "string", + "description": "Display title, for example `Verification volume`." }, - "total_declined": { - "type": "integer", - "description": "Sessions `Declined`." + "grouping_mode": { + "type": "string", + "enum": [ + "day", + "week", + "month" + ], + "description": "How the `*_time_series` lists are grouped: `day` for up to 14 days, `week` up to 90, `month` beyond. Measured from the first day with sessions in the range." }, - "total_canceled": { - "type": "integer", - "description": "Sessions `Expired` or `Abandoned`." + "data_points": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint" + } }, - "total_pending": { - "type": "integer", - "description": "Sessions `Not Started`, `In Progress` or `In Review` (includes `total_in_review`)." + "request_breakdown": { + "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown" }, - "total_expired": { - "type": "integer", - "description": "Sessions `Expired`." + "previous_data_points": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint" + } }, - "total_abandoned": { - "type": "integer", - "description": "Sessions `Abandoned`." + "previous_request_breakdown": { + "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown" }, - "total_in_progress": { - "type": "integer", - "description": "Sessions `In Progress`." + "conversion_rate": { + "type": "number", + "nullable": true + }, + "workflow_funnel_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsWorkflowFunnel" + }, + "verification_time_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimeStats" + }, + "verification_time_time_series": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimePoint" + } }, - "total_not_started": { - "type": "integer", - "description": "Sessions `Not Started`." + "warning_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsWarningStats" }, - "total_manually_approved": { - "type": "integer", - "description": "Approved by a reviewer." + "resubmission_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionStats" }, - "total_manually_declined": { - "type": "integer", - "description": "Declined by a reviewer." - } - } - }, - "ApplicationAnalyticsCountryCount": { - "type": "object", - "properties": { - "country": { - "type": "string", - "description": "Country name." + "resubmission_time_series": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionPoint" + } }, - "country_code": { - "type": "string", - "description": "Two-letter country code." + "original_status_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusStats" }, - "session_count": { - "type": "integer", - "description": "Sessions from that country." - } - } - }, - "ApplicationAnalyticsLocationStats": { - "type": "object", - "properties": { - "ip_countries": { + "original_status_time_series": { "type": "array", "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsCountryCount" - }, - "description": "Countries of the users' IP addresses, most sessions first." + "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusPoint" + } }, - "countries": { + "demographic_stats": { + "$ref": "#/components/schemas/ApplicationAnalyticsDemographicStats" + }, + "demographic_time_series": { "type": "array", "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsCountryCount" - }, - "description": "Same list as `ip_countries`." + "$ref": "#/components/schemas/ApplicationAnalyticsDemographicPoint" + } }, - "id_countries": { + "device_details": { + "$ref": "#/components/schemas/ApplicationAnalyticsDeviceDetails" + }, + "device_time_series": { "type": "array", "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsCountryCount" - }, - "description": "Issuing countries of the verified ID documents, most sessions first." + "$ref": "#/components/schemas/ApplicationAnalyticsDevicePoint" + } }, - "conversion_by_country": { + "items": { "type": "array", - "description": "Per document issuing country: finished sessions (approved, declined or in review) and how many were approved. Most finished first.", + "description": "Entries of a list widget. `country_distribution` (KYC): `country`, `country_code`, `session_count`. `conversion_by_country`: `country`, `country_code`, `finished`, `approved`. `time_series`: `date`, `value`. `status_time_series`: `date`, `approved`, `declined`, `flagged`. `breakdown`: `transaction_type` or `action_type` with `count` and `volume`, or `tag_id`, `tag_name`, `count`. `leaderboard`: `rule_title`, `trigger_count` or `assignee`, `handled_count`, `average_processing_seconds`, each with `approved_percentage`, `declined_percentage`, `flagged_percentage`. `histogram`: `score`, `count`.", "items": { "type": "object", - "properties": { - "country": { - "type": "string" - }, - "country_code": { - "type": "string" - }, - "finished": { - "type": "integer" - }, - "approved": { - "type": "integer" - } - } + "additionalProperties": {} } }, - "cities": { + "previous_items": { "type": "array", - "description": "Up to 100 IP cities, most sessions first.", + "description": "Transaction time series for the period of the same length right before `start_date`.", "items": { "type": "object", - "properties": { - "location": { - "type": "string", - "description": "`City, Country`." - }, - "session_count": { - "type": "integer" - }, - "latitude": { - "type": "number", - "nullable": true - }, - "longitude": { - "type": "number", - "nullable": true - } - } + "additionalProperties": {} } - } - } - }, - "ApplicationAnalyticsDemographicStats": { - "type": "object", - "properties": { - "age_distribution": { + }, + "value": { + "type": "number", + "description": "`metric` widgets: the figure for the range." + }, + "currency": { + "type": "string", + "nullable": true, + "description": "Transaction volume and amount widgets: the application's default transaction currency." + }, + "thresholds": { "type": "object", - "description": "Sessions per age band from the ID document. Empty when there is no data.", + "description": "`histogram` widget: the application's review and decline score thresholds.", "properties": { - "under_18": { - "type": "integer" - }, - "18_24": { - "type": "integer" - }, - "25_34": { + "review": { "type": "integer" }, - "35_44": { + "decline": { "type": "integer" - }, - "45_64": { + } + } + }, + "search": { + "type": "object", + "description": "`kyb_registry_coverage` widget: registry search totals.", + "properties": { + "searches_total": { "type": "integer" }, - "65_plus": { + "searches_with_no_candidates": { "type": "integer" } - }, - "additionalProperties": { - "type": "integer" } + } + } + }, + "ApplicationAnalyticsWidgetResponse": { + "type": "object", + "description": "Dashboard widgets, returned when `scope` or `widget_keys` is sent.", + "required": [ + "scope", + "available_widget_keys", + "requested_widget_keys", + "widgets" + ], + "properties": { + "scope": { + "type": "string", + "enum": [ + "home", + "kyc", + "kyb", + "transactions" + ], + "description": "Dashboard tab." }, - "gender_distribution": { + "available_widget_keys": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Every widget key this scope accepts." + }, + "requested_widget_keys": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The widget keys answered, in order: your valid `widget_keys`, or the scope's defaults." + }, + "widgets": { "type": "object", - "description": "Sessions per document gender code: `M`, `F` or `U` (unknown).", + "description": "Keyed by widget key, in the order of `requested_widget_keys`.", "additionalProperties": { - "type": "integer" + "$ref": "#/components/schemas/ApplicationAnalyticsWidget" } } } }, - "ApplicationAnalyticsDeviceDetails": { + "ApplicationAnalyticsToday": { "type": "object", - "description": "Top five of each, most sessions first.", + "description": "Today's verifications by local hour against the same weekday last week.", + "required": [ + "time_zone", + "date", + "current_hour", + "previous_date", + "hours", + "previous_hours", + "total", + "previous_total_so_far", + "outcomes" + ], "properties": { - "device_models": { - "type": "array", - "description": "Device brands: `Apple`, `Android`, `LG`, everything else grouped as `Other`.", - "items": { - "type": "object", - "properties": { - "device": { - "type": "string" - }, - "count": { - "type": "integer" - } - } - } + "time_zone": { + "type": "string", + "description": "The IANA time zone the day and its hours are in.", + "example": "Europe/Madrid" }, - "browsers": { + "date": { + "type": "string", + "format": "date", + "description": "Today in that time zone.", + "example": "2026-10-30" + }, + "current_hour": { + "type": "integer", + "minimum": 0, + "maximum": 23, + "description": "The local hour it is now.", + "example": 14 + }, + "previous_date": { + "type": "string", + "format": "date", + "description": "The comparison day: the same weekday one week before.", + "example": "2026-10-23" + }, + "hours": { "type": "array", - "description": "Browsers: `Chrome`, `Safari`, `Didit App`, `Firefox`, everything else grouped as `Other`.", "items": { - "type": "object", - "properties": { - "browser": { - "type": "string" - }, - "count": { - "type": "integer" - } - } - } + "type": "integer", + "minimum": 0 + }, + "minItems": 24, + "maxItems": 24, + "description": "Verifications created today, per local hour from 00:00. The hours still to come are 0." }, - "operating_systems": { + "previous_hours": { "type": "array", - "description": "Operating systems.", "items": { - "type": "object", - "properties": { - "os": { - "type": "string" - }, - "count": { - "type": "integer" - } + "type": "integer", + "minimum": 0 + }, + "minItems": 24, + "maxItems": 24, + "description": "Verifications created on the comparison day, per local hour from 00:00." + }, + "total": { + "type": "integer", + "minimum": 0, + "description": "Verifications created today so far.", + "example": 165 + }, + "previous_total_so_far": { + "type": "integer", + "minimum": 0, + "description": "Verifications created on the comparison day up to the same local time.", + "example": 151 + }, + "outcomes": { + "type": "object", + "description": "Of today's verifications, how many are approved, waiting in review and declined now. The rest are not finished yet.", + "required": [ + "approved", + "in_review", + "declined" + ], + "properties": { + "approved": { + "type": "integer", + "minimum": 0 + }, + "in_review": { + "type": "integer", + "minimum": 0 + }, + "declined": { + "type": "integer", + "minimum": 0 } } } } }, - "ApplicationAnalyticsWorkflowFunnel": { + "WebhookConfigDestination": { "type": "object", - "description": "Keyed by workflow ID. `total` is the sessions started on that workflow; `steps` counts the sessions that reached each step (`OCR`, `LIVENESS`, `FACE_MATCH`, `AML`, `POA`, `PHONE`, `EMAIL`, `NFC`, `DATABASE_VALIDATION`, `QUESTIONNAIRE`, `IP_ANALYSIS`, `AGE_ESTIMATION`, `KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE`). Reaching a step is not passing it.", - "additionalProperties": { - "type": "object", - "properties": { - "total": { - "type": "integer" - }, - "steps": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "reached": { - "type": "integer" - } - } - } + "description": "A webhook destination as listed in the webhook configuration, without delivery metrics. `GET /v3/webhook/destinations/{destination_uuid}/` adds its delivery summary.", + "required": [ + "uuid", + "label", + "url", + "enabled", + "webhook_version", + "secret_shared_key", + "subscribed_events", + "created_at", + "updated_at" + ], + "properties": { + "uuid": { + "type": "string", + "format": "uuid", + "description": "Destination ID." + }, + "label": { + "type": "string", + "maxLength": 255, + "description": "Human-readable name." + }, + "url": { + "type": "string", + "format": "uri", + "maxLength": 2000, + "description": "HTTPS endpoint Didit posts events to." + }, + "enabled": { + "type": "boolean", + "description": "`false` pauses deliveries to this destination." + }, + "webhook_version": { + "type": "string", + "enum": [ + "v1", + "v2", + "v3" + ], + "description": "Payload version sent to this destination." + }, + "secret_shared_key": { + "type": "string", + "description": "This destination's signing secret (43-character URL-safe token). Verify each webhook with the secret of the destination it was sent to. API-key callers always receive it in full; Console users without `read:webhooks` receive an empty string." + }, + "subscribed_events": { + "type": "array", + "uniqueItems": true, + "description": "Event types delivered to this destination. Empty when the destination was created without events, in which case it receives nothing.", + "items": { + "$ref": "#/components/schemas/WebhookEvent" } + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" } } }, - "ApplicationAnalyticsVerificationTimeStats": { + "WebhookConfig": { "type": "object", - "description": "Active time users spent verifying, ignoring idle gaps. An empty object when there is no data.", + "description": "Application-level webhook configuration, retention policy and Digital ID wallet return hosts, with every webhook destination.", + "required": [ + "webhook_url", + "webhook_version", + "secret_shared_key", + "capture_method", + "data_retention_months", + "face_retention_policy", + "face_retention_days", + "available_events", + "allowed_return_hosts", + "endpoints" + ], "properties": { - "overall_avg_seconds": { - "type": "number", - "description": "Average per session, one decimal." + "webhook_url": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "Application-level (legacy) webhook URL. Didit sends to it only while the application has no enabled destination, and then only `status.updated` and `data.updated`. Every create, update or delete of a destination sets it to the URL of the oldest enabled destination, or `null` when none is enabled." }, - "overall_count": { + "webhook_version": { + "type": "string", + "enum": [ + "v1", + "v2", + "v3" + ], + "description": "Payload version of the legacy `webhook_url`. Each destination has its own `webhook_version`." + }, + "secret_shared_key": { + "type": "string", + "description": "Application-level signing secret (43-character URL-safe token). It signs only deliveries to the legacy `webhook_url`; each destination signs with its own `secret_shared_key`. API-key callers always receive it in full; Console users without `read:webhooks` receive an empty string." + }, + "capture_method": { + "type": "string", + "enum": [ + "MOBILE", + "MOBILE_AND_DESKTOP" + ], + "description": "Legacy application setting. The verification flow does not read it: capture options are configured per workflow." + }, + "data_retention_months": { "type": "integer", - "description": "Sessions measured." + "nullable": true, + "minimum": 1, + "maximum": 120, + "description": "Automatic deletion window. User verification sessions created more than this many months ago (a month counts as 30 days) are deleted automatically, and that deletion is irreversible. `null` means sessions are never deleted automatically. See [Data retention](https://docs.didit.me/console/data-retention)." }, - "per_feature": { - "type": "object", - "description": "Keyed by feature, for example `OCR` or `LIVENESS`.", - "additionalProperties": { + "face_retention_policy": { + "type": "string", + "enum": [ + "delete_with_session", + "retain_until_user_deleted" + ], + "description": "What happens to a session's face embedding when the session is deleted. `delete_with_session` (default) deletes it with the session. `retain_until_user_deleted` is the opt-in [biometric template retention](https://docs.didit.me/console/data-retention#biometric-template-retention): an image-free biometric template linked to the User is managed separately until its retention period ends, the User is deleted, or you purge it." + }, + "face_retention_days": { + "type": "integer", + "nullable": true, + "minimum": 1, + "maximum": 3650, + "description": "Retention period, in days, of biometric templates under `retain_until_user_deleted`. Required when that policy is set." + }, + "biometric_consent_mode": { + "type": "string", + "enum": [ + "auto", + "always", + "never" + ], + "description": "When the hosted flow and the native SDKs ask the person for explicit biometric consent before a face capture. `auto` (default) asks only where a trigger applies: a declared state, the person's IP, or the identity document's issuer is in Illinois, Texas or Colorado, or the person looks to be in the US without a known state. `always` asks every person whose workflow captures a face. `never` never shows the step, and you collect consent yourself before the selfie. Each change is recorded in the audit log. See [Biometric consent](https://docs.didit.me/getting-started/biometric-consent)." + }, + "available_events": { + "type": "array", + "description": "Every event type a destination can subscribe to, with a display label.", + "items": { "type": "object", + "required": [ + "value", + "label" + ], "properties": { - "avg_seconds": { - "type": "number" - }, - "total_seconds": { - "type": "number" + "value": { + "$ref": "#/components/schemas/WebhookEvent" }, - "count": { - "type": "integer" + "label": { + "type": "string", + "description": "Display label, for example `Session status updated`." } } } }, - "per_sub_step": { - "type": "object", - "description": "Keyed by feature, then by sub-step, for example `front_id_photo`.", - "additionalProperties": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "avg_seconds": { - "type": "number" - }, - "total_seconds": { - "type": "number" - }, - "count": { - "type": "integer" - } - } - } + "allowed_return_hosts": { + "type": "array", + "maxItems": 20, + "description": "Hostnames (exact match, HTTPS only) a standalone Digital ID wallet verification may send the user back to with its `return_url`. Your white-label domain is always allowed as well. See [Register your return destination](https://docs.didit.me/standalone-apis/digital-id-wallets#register-your-return-destination).", + "items": { + "type": "string", + "maxLength": 253 } + }, + "endpoints": { + "type": "array", + "description": "Every webhook destination of the application, oldest first, each with its signing secret. Read only here: manage destinations with the `/v3/webhook/destinations/` endpoints.", + "items": { + "$ref": "#/components/schemas/WebhookConfigDestination" + } + }, + "allowed_domains": { + "type": "array", + "maxItems": 50, + "items": { + "type": "string", + "maxLength": 300 + }, + "description": "Origins (for example `https://app.example.com`; `http` only for `localhost`) the hosted verification flow may be embedded in and may send the user back to with a session callback. Server-to-server calls are not affected. An empty list means no restriction. Didit stores each origin in lower case without a default port. An invalid entry fails with `400` on `allowed_domains`.", + "example": [ + "https://app.example.com" + ] } } }, - "ApplicationAnalyticsResubmissionStats": { + "WebhookDestinationDelivery": { "type": "object", + "description": "One delivery attempt to a webhook destination. The first send of an event, each automatic retry and each resend are separate deliveries.", + "required": [ + "uuid", + "session_id", + "request_url", + "response_status", + "response_time_ms", + "status", + "webhook_type", + "created_at" + ], "properties": { - "first_pass": { - "type": "integer", - "description": "Finished sessions with no resubmission." + "uuid": { + "type": "string", + "format": "uuid", + "description": "Delivery ID, for the detail and resend calls." }, - "second": { - "type": "integer", - "description": "Finished sessions resubmitted once." + "session_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "User verification session the event is about. `null` for business session, user, business, transaction, Travel Rule and workflow events." }, - "third_plus": { + "request_url": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "URL the delivery was sent to: the destination's URL when the event was generated." + }, + "response_status": { "type": "integer", - "description": "Finished sessions resubmitted two or more times." + "nullable": true, + "description": "HTTP status your endpoint returned. `null` while the delivery is queued and not yet attempted. When no HTTP answer was received Didit records a status of its own: `504` when your endpoint did not answer within 5 seconds, `503` for a connection failure, `400` when the URL was refused as unsafe (for example a private or internal address), and `404` for any other request error. `400` or above counts as a failed delivery." }, - "abandoned": { + "response_time_ms": { "type": "integer", - "description": "Abandoned sessions." + "nullable": true, + "minimum": 0, + "description": "Time the attempt took, in milliseconds. `null` while the delivery is queued." + }, + "status": { + "type": "string", + "nullable": true, + "description": "Status the event reported when it was generated: the session status for session events (for example `Approved` or `In Review`), the person's or company's status for user and business events, and the transaction status for transaction events. `null` for events that carry no status." + }, + "webhook_type": { + "$ref": "#/components/schemas/WebhookEvent" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "When the delivery was created." } } }, - "ApplicationAnalyticsOriginalStatusStats": { + "WebhookDestinationDeliveryDetail": { "type": "object", - "description": "The workflow's automatic verdict, before any reviewer changed it.", + "description": "One delivery attempt to a webhook destination, with the exact request headers and body Didit sent.", + "required": [ + "uuid", + "session_id", + "request_url", + "response_status", + "response_time_ms", + "status", + "webhook_type", + "created_at", + "request_header", + "request_body" + ], "properties": { - "approved": { - "type": "integer" + "uuid": { + "type": "string", + "format": "uuid", + "description": "Delivery ID, for the detail and resend calls." }, - "in_review": { - "type": "integer" + "session_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "User verification session the event is about. `null` for business session, user, business, transaction, Travel Rule and workflow events." }, - "declined": { - "type": "integer" - } - } - }, - "ApplicationAnalyticsWarningStats": { - "type": "object", - "description": "Keyed by feature (`ID_VERIFICATION`, `LIVENESS`, `FACEMATCH`, `AML`, `PROOF_OF_ADDRESS`, `PHONE`, `EMAIL`, `NFC`, `LOCATION`, `DATABASE_VALIDATION`, `QUESTIONNAIRE` and the KYB features). `total` is the sessions that reached the feature; `risks` counts sessions per warning code and level.", - "additionalProperties": { - "type": "object", - "properties": { - "total": { - "type": "integer" - }, - "risks": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "error": { - "type": "integer" - }, - "warning": { - "type": "integer" - }, - "information": { - "type": "integer" - } - } - } - } + "request_url": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "URL the delivery was sent to: the destination's URL when the event was generated." + }, + "response_status": { + "type": "integer", + "nullable": true, + "description": "HTTP status your endpoint returned. `null` while the delivery is queued and not yet attempted. When no HTTP answer was received Didit records a status of its own: `504` when your endpoint did not answer within 5 seconds, `503` for a connection failure, `400` when the URL was refused as unsafe (for example a private or internal address), and `404` for any other request error. `400` or above counts as a failed delivery." + }, + "response_time_ms": { + "type": "integer", + "nullable": true, + "minimum": 0, + "description": "Time the attempt took, in milliseconds. `null` while the delivery is queued." + }, + "status": { + "type": "string", + "nullable": true, + "description": "Status the event reported when it was generated: the session status for session events (for example `Approved` or `In Review`), the person's or company's status for user and business events, and the transaction status for transaction events. `null` for events that carry no status." + }, + "webhook_type": { + "$ref": "#/components/schemas/WebhookEvent" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "When the delivery was created." + }, + "request_header": { + "type": "string", + "description": "JSON text (a string) of the request headers Didit sent: `Content-Type`, `X-Signature`, `X-Signature-V2`, `X-Signature-Simple`, `X-Timestamp` and `User-Agent`. Parse it with a JSON parser. It holds signatures, never the signing secret." + }, + "request_body": { + "type": "string", + "description": "JSON text (a string) of the exact payload Didit sent, keys sorted, including `event_id` and `timestamp`. Parse it with a JSON parser; see [Payload shape](https://docs.didit.me/integration/webhooks#payload-shape). For a scoped key without `media: read`, media URLs inside it are `null`; without `sessions: write`, session tokens and hosted verification links are `null`. A body changed that way no longer matches its signatures. Didit does not record the response body your endpoint returned." } } }, - "ApplicationAnalyticsDemographicPoint": { + "SessionWebhookDelivery": { "type": "object", + "description": "One webhook delivery attempt recorded for a verification session, with the exact request headers and body Didit sent.", + "required": [ + "uuid", + "session_id", + "request_url", + "response_status", + "status", + "webhook_type", + "request_header", + "request_body", + "created_at" + ], "properties": { - "date": { + "uuid": { "type": "string", - "description": "Period key: `YYYY-MM-DD` for a day, the Monday of a week, or `YYYY-MM` for a month, following `grouping_mode`." + "format": "uuid", + "description": "Delivery ID. Use it as `{webhook_uuid}` to get or resend this delivery." }, - "age_distribution": { - "type": "object", - "additionalProperties": { - "type": "integer" - } + "session_id": { + "type": "string", + "format": "uuid", + "description": "The session the delivery belongs to (the session in the path)." }, - "gender_distribution": { - "type": "object", - "additionalProperties": { - "type": "integer" - } + "request_url": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "URL the delivery was sent to." + }, + "response_status": { + "type": "integer", + "nullable": true, + "description": "HTTP status your endpoint returned. `null` while the delivery is queued and not yet attempted. When no HTTP answer was received Didit records a status of its own: `504` when your endpoint did not answer within 5 seconds, `503` for a connection failure, `400` when the URL was refused as unsafe (for example a private or internal address), and `404` for any other request error. `400` or above counts as a failed delivery." + }, + "status": { + "type": "string", + "nullable": true, + "description": "Session status when the event was generated, for example `In Progress`, `Approved` or `Declined`." + }, + "webhook_type": { + "$ref": "#/components/schemas/WebhookEvent" + }, + "request_header": { + "type": "string", + "description": "JSON text (a string) of the request headers Didit sent: `Content-Type`, `X-Signature`, `X-Signature-V2`, `X-Signature-Simple`, `X-Timestamp` and `User-Agent`. Parse it with a JSON parser. It holds signatures, never the signing secret." + }, + "request_body": { + "type": "string", + "description": "JSON text (a string) of the exact payload Didit sent, keys sorted, including `event_id` and `timestamp`. Parse it with a JSON parser; see [Payload shape](https://docs.didit.me/integration/webhooks#payload-shape). For a scoped key without `media: read`, media URLs inside it are `null`; without `sessions: write`, session tokens and hosted verification links are `null`. A body changed that way no longer matches its signatures. Didit does not record the response body your endpoint returned." + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "When the delivery was created." } } }, - "ApplicationAnalyticsDevicePoint": { + "SessionEvent": { "type": "object", + "description": "One entry of a verification session's event timeline.", + "required": [ + "uuid", + "event_type", + "created_at", + "component", + "feature_step", + "step", + "details", + "ip_address", + "user_agent", + "device_info", + "file_url", + "sent_at" + ], "properties": { - "date": { + "uuid": { "type": "string", - "description": "Period key: `YYYY-MM-DD` for a day, the Monday of a week, or `YYYY-MM` for a month, following `grouping_mode`." + "format": "uuid", + "description": "Event identifier." }, - "devices": { - "type": "object", - "additionalProperties": { - "type": "integer" - } + "event_type": { + "type": "string", + "enum": [ + "SESSION_CREATED", + "SESSION_COMPLETED", + "SESSION_STATUS_CHANGED", + "LINK_OPENED", + "FORM_SUBMITTED", + "BUTTON_CLICKED", + "FILE_UPLOADED", + "ATTEMPT_FAILED", + "FEATURE_STEP_CHANGED", + "STEP_RENDERED", + "NOTE_ADDED", + "MANUAL_REVIEW_STARTED", + "WORKFLOW_BRANCH_EVALUATED", + "WORKFLOW_STATUS_NODE_REACHED", + "LOG" + ], + "description": "What happened. Reported by the device during the hosted flow or SDK: `LINK_OPENED`, `STEP_RENDERED`, `BUTTON_CLICKED`, `FORM_SUBMITTED`, `FILE_UPLOADED`, `ATTEMPT_FAILED` and `LOG` (debugging). Recorded by the server: `SESSION_CREATED`, `SESSION_STATUS_CHANGED` (`details.old_status`, `details.current_status`), `FEATURE_STEP_CHANGED` (`details.old_feature_step`, `details.current_feature_step`), `WORKFLOW_BRANCH_EVALUATED` and `WORKFLOW_STATUS_NODE_REACHED` (the workflow routing trace). `SESSION_COMPLETED`, `NOTE_ADDED` and `MANUAL_REVIEW_STARTED` can appear on older sessions." }, - "browsers": { - "type": "object", - "additionalProperties": { - "type": "integer" - } + "created_at": { + "type": "string", + "format": "date-time", + "description": "When Didit stored the event. Events are stored asynchronously, a few seconds after `sent_at`." }, - "operating_systems": { + "component": { + "type": "string", + "nullable": true, + "description": "UI component that reported the event (device events only)." + }, + "feature_step": { + "type": "string", + "nullable": true, + "enum": [ + "OCR", + "OCR_BACK", + "NFC", + "AML", + "FACE", + "LIVENESS", + "FACE_MATCH", + "IP_ANALYSIS", + "AGE_ESTIMATION", + "PROOF_OF_ADDRESS", + "PHONE_VERIFICATION", + "EMAIL_VERIFICATION", + "FACE_SEARCH", + "DATABASE_VALIDATION", + "QUESTIONNAIRE", + "KYB_REGISTRY", + "KYB_DOCUMENTS", + "KYB_KEY_PEOPLE", + "DOCUMENT_AI", + "GEOLOCATION", + null + ], + "description": "Verification feature the session was on when the event happened." + }, + "step": { + "type": "string", + "nullable": true, + "description": "Screen within the feature, for example `DOCUMENT_CAPTURE_FRONT` or `FACE_PASSIVE_LIVENESS`." + }, + "details": { "type": "object", - "additionalProperties": { - "type": "integer" - } - } - } - }, - "ApplicationAnalyticsVerificationTimePoint": { - "type": "object", - "properties": { - "date": { + "nullable": true, + "additionalProperties": true, + "description": "Event-specific data. The keys depend on `event_type`." + }, + "ip_address": { "type": "string", - "description": "Period key: `YYYY-MM-DD` for a day, the Monday of a week, or `YYYY-MM` for a month, following `grouping_mode`." + "nullable": true, + "description": "IP address the device reported the event from. `null` for server-recorded events." }, - "overall_avg": { - "type": "number", - "description": "Average active seconds per session." + "user_agent": { + "type": "string", + "nullable": true, + "description": "User agent of the device. `null` for server-recorded events." }, - "per_feature": { + "device_info": { "type": "object", - "description": "Average active seconds per feature.", - "additionalProperties": { - "type": "number" - } + "nullable": true, + "additionalProperties": true, + "description": "Device details the SDK or browser reported." + }, + "file_url": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "Short-lived presigned link to a file attached to the event (for example a captured image). `null` when there is none, and always `null` for a scoped API key without `media: read`." + }, + "sent_at": { + "type": "integer", + "format": "int64", + "description": "When the event happened, as a Unix timestamp in milliseconds. Results are ordered by it." } } }, - "ApplicationAnalyticsResubmissionPoint": { + "AMLDatasetSourceFreshness": { "type": "object", + "description": "Freshness of one family of AML datasets.", + "required": [ + "last_updated_at", + "oldest_updated_at", + "dataset_count", + "dated_dataset_count" + ], "properties": { - "date": { + "last_updated_at": { "type": "string", - "description": "Period key: `YYYY-MM-DD` for a day, the Monday of a week, or `YYYY-MM` for a month, following `grouping_mode`." - }, - "first_pass": { - "type": "integer" + "format": "date-time", + "description": "Most recent update of any dataset in the family." }, - "second": { - "type": "integer" + "oldest_updated_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "Staleness bound: every dataset in the family is at least this current. `null` when at least one dataset in the family reported no update date, because the bound is then unknown." }, - "third_plus": { - "type": "integer" + "dataset_count": { + "type": "integer", + "description": "Number of datasets in the family." }, - "abandoned": { - "type": "integer" + "dated_dataset_count": { + "type": "integer", + "description": "Number of those datasets that reported an update date." } } }, - "ApplicationAnalyticsOriginalStatusPoint": { + "AMLDatasetFreshness": { "type": "object", + "description": "How current the AML datasets were when a screening ran. Dates are never estimated.", + "required": [ + "captured_at", + "provider", + "catalog_version", + "sources" + ], "properties": { - "date": { + "captured_at": { "type": "string", - "description": "Period key: `YYYY-MM-DD` for a day, the Monday of a week, or `YYYY-MM` for a month, following `grouping_mode`." + "format": "date-time", + "description": "When Didit read the dataset catalog this freshness comes from." }, - "approved": { - "type": "integer" + "provider": { + "type": "string", + "description": "Opaque identifier of the AML data source. Treat it as an opaque string; do not branch on it.", + "example": "aml_data_source" }, - "in_review": { - "type": "integer" + "catalog_version": { + "type": "string", + "nullable": true, + "description": "Version identifier of the dataset catalog, when the source reports one." }, - "declined": { - "type": "integer" + "sources": { + "type": "object", + "description": "Freshness per dataset family. A family whose datasets reported no update date is absent rather than filled with `null`.", + "properties": { + "sanctions": { + "$ref": "#/components/schemas/AMLDatasetSourceFreshness" + }, + "pep": { + "$ref": "#/components/schemas/AMLDatasetSourceFreshness" + }, + "warnings": { + "$ref": "#/components/schemas/AMLDatasetSourceFreshness" + }, + "adverse_media": { + "$ref": "#/components/schemas/AMLDatasetSourceFreshness" + } + } } } }, - "ApplicationAnalyticsSummary": { + "AMLScreeningRun": { "type": "object", - "description": "User verification (KYC) summary, returned when neither `scope` nor `widget_keys` is sent.", + "description": "One completed ongoing-monitoring re-screen of an AML check.", "required": [ - "data_points", - "request_breakdown", - "previous_data_points", - "previous_request_breakdown", - "conversion_rate", - "location_stats", - "demographic_stats", - "device_details", - "workflow_funnel_stats", - "verification_time_stats", - "resubmission_stats", - "warning_stats", - "original_status_stats", - "grouping_mode", - "demographic_time_series", - "device_time_series", - "verification_time_time_series", - "resubmission_time_series", - "original_status_time_series" + "uuid", + "run_id", + "completed_at", + "started_at", + "outcome", + "trigger", + "provider", + "status", + "score", + "total_hits", + "new_hits", + "entities_screened", + "dataset_freshness" ], "properties": { - "data_points": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint" - }, - "description": "One point per day, from the first day with sessions in the range to `end_date`. Always daily, whatever `grouping_mode` says." - }, - "request_breakdown": { - "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown" - }, - "previous_data_points": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint" - }, - "description": "Daily points for the period of the same length right before `start_date`." - }, - "previous_request_breakdown": { - "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown" - }, - "conversion_rate": { - "type": "number", - "nullable": true, - "description": "`total_approved / (total_approved + total_declined + total_in_review) x 100`, one decimal. `null` when nothing finished." - }, - "location_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsLocationStats" - }, - "demographic_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsDemographicStats" + "uuid": { + "type": "string", + "format": "uuid", + "description": "Identifier of this screening run." }, - "device_details": { - "$ref": "#/components/schemas/ApplicationAnalyticsDeviceDetails" + "run_id": { + "type": "string", + "format": "uuid", + "description": "The monitoring run this screening belongs to. Every verification screened in the same run shares it." }, - "workflow_funnel_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsWorkflowFunnel" + "completed_at": { + "type": "string", + "format": "date-time", + "description": "When this subject's re-screen finished. Results are ordered by it, newest first." }, - "verification_time_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimeStats" + "started_at": { + "type": "string", + "format": "date-time", + "description": "When the monitoring batch this re-screen belongs to started." }, - "resubmission_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionStats" + "outcome": { + "type": "string", + "enum": [ + "NO_CHANGE", + "CHANGED", + "FAILED" + ], + "description": "`NO_CHANGE`: completed and the result did not move. `CHANGED`: completed and the score, status, hit count or hits changed. `FAILED`: no usable answer for this subject, so the check was left as it was." }, - "warning_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsWarningStats" + "trigger": { + "type": "string", + "enum": [ + "ONGOING_MONITORING" + ], + "description": "What started the screening. Always `ONGOING_MONITORING` today." }, - "original_status_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusStats" + "provider": { + "type": "string", + "description": "Opaque identifier of the AML data source that answered. Treat it as an opaque string; do not branch on it.", + "example": "aml_data_source" }, - "grouping_mode": { + "status": { "type": "string", + "nullable": true, "enum": [ - "day", - "week", - "month" + "Not Finished", + "Approved", + "Declined", + "In Review", + "Resub Requested", + null ], - "description": "How the `*_time_series` lists are grouped: `day` for up to 14 days, `week` up to 90, `month` beyond. Measured from the first day with sessions in the range." + "description": "AML check status this run left the check in." }, - "demographic_time_series": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsDemographicPoint" - } + "score": { + "type": "number", + "format": "float", + "nullable": true, + "minimum": 0, + "maximum": 100, + "description": "AML score this run left the check in." }, - "device_time_series": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsDevicePoint" - } + "total_hits": { + "type": "integer", + "nullable": true, + "description": "Number of hits this run left the check in." }, - "verification_time_time_series": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimePoint" - } + "new_hits": { + "type": "integer", + "nullable": true, + "description": "Number of hits this run found that the check did not have before it. `0` when nothing new was found; `null` when the run failed or was recorded before this count existed." }, - "resubmission_time_series": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionPoint" - } + "entities_screened": { + "type": "integer", + "minimum": 0, + "maximum": 1, + "description": "Number of entities this run screened for the verification: `1` when the subject was screened, `0` when the run failed." }, - "original_status_time_series": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusPoint" - } + "dataset_freshness": { + "allOf": [ + { + "$ref": "#/components/schemas/AMLDatasetFreshness" + } + ], + "nullable": true, + "description": "Dataset freshness behind this run, or `null` when no dates were available." } } }, - "ApplicationAnalyticsWidget": { + "KYBKeyPeopleParty": { "type": "object", - "description": "One dashboard widget. Every widget has `kind` and `title`; the other fields depend on `kind`. The session widgets reuse the summary objects (`data_points`, `request_breakdown`, `workflow_funnel_stats` and so on); list widgets put their entries in `items`; transaction metrics use `value`.", + "description": "A Key People party of a Business Verification (KYB) session, with its child verification. The same party appears in `key_people_checks[].submitted.parties[]` of the business session decision.", "required": [ - "kind", - "title" + "uuid", + "entity_type", + "source", + "name", + "is_active", + "is_skipped", + "requires_verification", + "roles", + "kyc_session_deleted", + "kyb_sub_session_deleted" ], "properties": { - "kind": { + "uuid": { "type": "string", - "enum": [ - "sessions_volume", - "workflow_funnel", - "average_verification_time", - "country_distribution", - "warning_insights", - "conversion_rate", - "conversion_by_country", - "resubmission_insights", - "original_status_distribution", - "database_validation_coverage", - "database_validation_latency", - "demographics", - "device_details", - "horizontal_bar", - "kyb_registry_coverage", - "kyb_registry_data_completeness", - "metric", - "time_series", - "breakdown", - "status_time_series", - "leaderboard", - "histogram" - ], - "description": "Widget type." + "format": "uuid", + "description": "Party identifier." }, - "title": { + "entity_type": { "type": "string", - "description": "Display title, for example `Verification volume`." + "enum": [ + "person", + "company" + ], + "description": "Whether the party is an individual or a company." }, - "grouping_mode": { + "source": { "type": "string", "enum": [ - "day", - "week", - "month" + "REGISTRY", + "USER" ], - "description": "How the `*_time_series` lists are grouped: `day` for up to 14 days, `week` up to 90, `month` beyond. Measured from the first day with sessions in the range." + "description": "`REGISTRY`: taken from the company registry. `USER`: entered in the Key People screen." }, - "data_points": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint" - } + "name": { + "type": "string", + "description": "Display name of the party." }, - "request_breakdown": { - "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown" + "first_name": { + "type": "string", + "nullable": true, + "description": "First name (persons)." }, - "previous_data_points": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint" - } + "last_name": { + "type": "string", + "nullable": true, + "description": "Last name (persons)." }, - "previous_request_breakdown": { - "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown" + "company_name": { + "type": "string", + "nullable": true, + "description": "Company name (company parties)." }, - "conversion_rate": { - "type": "number", - "nullable": true + "registration_number": { + "type": "string", + "nullable": true, + "description": "Company registration number (company parties)." }, - "workflow_funnel_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsWorkflowFunnel" + "email": { + "type": "string", + "format": "email", + "nullable": true, + "description": "Email the verification link is sent to." }, - "verification_time_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimeStats" + "nationality": { + "type": "string", + "nullable": true, + "description": "Nationality for persons, country of incorporation for companies." }, - "verification_time_time_series": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimePoint" - } + "phone_number": { + "type": "string", + "nullable": true, + "description": "Phone number collected for the party." }, - "warning_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsWarningStats" + "date_of_birth": { + "type": "string", + "format": "date", + "nullable": true, + "description": "Date of birth (persons)." }, - "resubmission_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionStats" + "position": { + "type": "string", + "nullable": true, + "description": "Free-text job title (persons)." }, - "resubmission_time_series": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionPoint" - } + "custom_fields": { + "type": "object", + "additionalProperties": true, + "description": "Workflow-defined custom fields collected for the party, keyed by field key." }, - "original_status_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusStats" + "is_active": { + "type": "boolean", + "description": "Whether the party is active." }, - "original_status_time_series": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusPoint" - } + "is_skipped": { + "type": "boolean", + "description": "Whether the party is exempt from verification. Regenerating clears it." }, - "demographic_stats": { - "$ref": "#/components/schemas/ApplicationAnalyticsDemographicStats" + "requires_verification": { + "type": "boolean", + "description": "Whether the role and ownership rules require a verification for this party." }, - "demographic_time_series": { + "roles": { "type": "array", + "description": "Roles the party holds in the company.", "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsDemographicPoint" + "type": "object", + "required": [ + "role", + "ownership_percent", + "voting_percent" + ], + "properties": { + "role": { + "type": "string", + "enum": [ + "director", + "non_executive_director", + "secretary", + "chairman", + "ubo", + "shareholder", + "representative", + "founder", + "legal_advisor", + "authorized_signatory", + "trustee", + "beneficiary", + "settlor", + "protector", + "company_officer", + "investor", + "other" + ], + "description": "Role code." + }, + "ownership_percent": { + "type": "number", + "nullable": true, + "description": "Ownership percentage for this role, when known." + }, + "voting_percent": { + "type": "number", + "nullable": true, + "description": "Voting-rights percentage for this role, when known." + } + } } }, - "device_details": { - "$ref": "#/components/schemas/ApplicationAnalyticsDeviceDetails" + "kyc_session_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "Child individual KYC session (persons)." }, - "device_time_series": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationAnalyticsDevicePoint" - } + "kyc_session_status": { + "type": "string", + "nullable": true, + "enum": [ + "Not Started", + "In Progress", + "Approved", + "Declined", + "In Review", + "Expired", + "Abandoned", + "Kyc Expired", + "Resubmitted", + "Awaiting User", + null + ], + "description": "Status of the child KYC session. A deleted session keeps the status it had when it was deleted." }, - "items": { - "type": "array", - "description": "Entries of a list widget. `country_distribution` (KYC): `country`, `country_code`, `session_count`. `conversion_by_country`: `country`, `country_code`, `finished`, `approved`. `time_series`: `date`, `value`. `status_time_series`: `date`, `approved`, `declined`, `flagged`. `breakdown`: `transaction_type` or `action_type` with `count` and `volume`, or `tag_id`, `tag_name`, `count`. `leaderboard`: `rule_title`, `trigger_count` or `assignee`, `handled_count`, `average_processing_seconds`, each with `approved_percentage`, `declined_percentage`, `flagged_percentage`. `histogram`: `score`, `count`.", - "items": { - "type": "object", - "additionalProperties": {} - } + "kyc_session_url": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "Hosted link of the child KYC session. `null` when there is none or it was deleted, and for a scoped API key without `sessions: write`." }, - "previous_items": { - "type": "array", - "description": "Transaction time series for the period of the same length right before `start_date`.", - "items": { - "type": "object", - "additionalProperties": {} - } + "kyc_session_deleted": { + "type": "boolean", + "description": "The child KYC session was deleted, so it can never settle." }, - "value": { - "type": "number", - "description": "`metric` widgets: the figure for the range." + "kyb_sub_session_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "Child KYB session (company parties)." }, - "currency": { + "kyb_sub_session_status": { "type": "string", "nullable": true, - "description": "Transaction volume and amount widgets: the application's default transaction currency." + "enum": [ + "Not Started", + "In Progress", + "Approved", + "Declined", + "In Review", + "Expired", + "Abandoned", + "Kyc Expired", + "Resubmitted", + "Awaiting User", + null + ], + "description": "Status of the child KYB session." }, - "thresholds": { - "type": "object", - "description": "`histogram` widget: the application's review and decline score thresholds.", - "properties": { - "review": { - "type": "integer" - }, - "decline": { - "type": "integer" - } - } + "kyb_sub_session_url": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "Hosted link of the child KYB session, with the same `null` rules as `kyc_session_url`." }, - "search": { - "type": "object", - "description": "`kyb_registry_coverage` widget: registry search totals.", - "properties": { - "searches_total": { - "type": "integer" - }, - "searches_with_no_candidates": { - "type": "integer" + "kyb_sub_session_deleted": { + "type": "boolean", + "description": "Company-party counterpart of `kyc_session_deleted`." + }, + "verification_workflow_type": { + "type": "string", + "nullable": true, + "enum": [ + "kyc", + "kyb", + "adaptive_age_verification", + "biometric_authentication", + "address_verification", + "questionnaire_verification", + "email_verification", + "phone_verification", + null + ], + "description": "Type of the workflow the child session runs." + }, + "verification_workflow_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "Workflow the child session runs." + }, + "verification_workflow_label": { + "type": "string", + "nullable": true, + "description": "Label of that workflow." + }, + "verification_workflow_features": { + "type": "array", + "nullable": true, + "description": "Features of the child session's workflow with their current status.", + "items": { + "type": "object", + "required": [ + "feature", + "status" + ], + "properties": { + "feature": { + "type": "string", + "description": "Feature code, for example `ID_VERIFICATION` or `LIVENESS`." + }, + "status": { + "type": "string", + "description": "Feature status, `Not Finished` until it runs." + } } } + }, + "didit_internal_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "Didit's identifier of the verified person, once known." } } }, - "ApplicationAnalyticsWidgetResponse": { + "TravelRuleDelivery": { "type": "object", - "description": "Dashboard widgets, returned when `scope` or `widget_keys` is sent.", + "description": "Where the latest message the transfer owes the other side stands. Didit contacts the counterparty after the request that created or changed the transfer has returned, so this object says whether that message got through: queued, being sent, waiting to be retried after an error, delivered, or failed. A failure the network may still recover from (no answer in time, a failed connection, HTTP `408`, `429` or `5xx`) is tried again after 30 seconds, 2 minutes, 10 minutes, 30 minutes and 1 hour. When a first message (`kind: SEND`) fails for good, because the network refused it or the sixth attempt failed too, the transfer moves to `COUNTERPARTY_VASP_NOT_REACHABLE` with `last_error` in its `timeline`; any other message that fails for good is noted in the `timeline`. The transfer's `status` stays the source of truth for the exchange itself.", "required": [ - "scope", - "available_widget_keys", - "requested_widget_keys", - "widgets" + "kind", + "status", + "rail", + "attempts", + "last_error", + "next_attempt_at", + "delivered_at" ], "properties": { - "scope": { + "kind": { "type": "string", "enum": [ - "home", - "kyc", - "kyb", - "transactions" + "SEND", + "ANSWER", + "TXID", + "CANCEL", + "POLL" ], - "description": "Dashboard tab." + "description": "What the message carries. `SEND`: the transfer's first message to the counterparty (outbound; the rail is chosen when it is sent). `ANSWER`: your accept or decline, owed to the network that asked (inbound). `TXID`: the on-chain transaction hash, after you finish the transfer. `CANCEL`: the cancellation, after you cancel it. `POLL`: a status query to a network that offers one, repeated every 5 minutes while the transfer waits on the counterparty." }, - "available_widget_keys": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Every widget key this scope accepts." + "status": { + "type": "string", + "enum": [ + "QUEUED", + "SENDING", + "RETRYING", + "DELIVERED", + "FAILED" + ], + "description": "`QUEUED`: waiting to be sent. `SENDING`: an attempt is running. `RETRYING`: an attempt failed and the next one runs at `next_attempt_at`. `DELIVERED`: the other side took the message. `FAILED`: the other side refused it, or the last attempt failed." + }, + "rail": { + "type": "string", + "enum": [ + "INTERNAL", + "TRP", + "GTR", + "TRUST", + "VERIFYVASP", + "SYGNA", + "EMAIL", + "" + ], + "description": "The rail that carries the message. Empty until Didit has chosen one for a first message." + }, + "attempts": { + "type": "integer", + "minimum": 0, + "description": "Attempts made so far for this message. A message that is not a status poll is attempted at most 6 times." }, - "requested_widget_keys": { - "type": "array", - "items": { - "type": "string" - }, - "description": "The widget keys answered, in order: your valid `widget_keys`, or the scope's defaults." + "last_error": { + "type": "string", + "description": "The kind of failure the last attempt hit, `\"\"` when none did: for example `email undeliverable`, `trp identity endpoint unreachable` or `trp transfer inquiry delivery failed`. It never carries the counterparty's own answer, which stays on the transfer's `timeline`.\nWhen GTR answers with an error, its own status code and message are included. Response bodies are never included.", + "example": "email undeliverable" }, - "widgets": { - "type": "object", - "description": "Keyed by widget key, in the order of `requested_widget_keys`.", - "additionalProperties": { - "$ref": "#/components/schemas/ApplicationAnalyticsWidget" - } + "next_attempt_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the next attempt runs while the message is `QUEUED` or `RETRYING`." + }, + "delivered_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the other side took the message." } } }, - "WebhookConfigDestination": { + "TravelRuleDiscoveryStep": { "type": "object", - "description": "A webhook destination as listed in the webhook configuration, without delivery metrics. `GET /v3/webhook/destinations/{destination_uuid}/` adds its delivery summary.", - "required": [ - "uuid", - "label", - "url", - "enabled", - "webhook_version", - "secret_shared_key", - "subscribed_events", - "created_at", - "updated_at" - ], + "description": "One step of the counterparty discovery Didit ran for an outbound transfer, in the order it ran them. The first step that names a VASP with a route ends the chain.", "properties": { - "uuid": { - "type": "string", - "format": "uuid", - "description": "Destination ID." - }, - "label": { - "type": "string", - "maxLength": 255, - "description": "Human-readable name." - }, - "url": { + "step": { "type": "string", - "format": "uri", - "maxLength": 2000, - "description": "HTTPS endpoint Didit posts events to." - }, - "enabled": { - "type": "boolean", - "description": "`false` pauses deliveries to this destination." + "enum": [ + "internal_address_book", + "wallet_attribution", + "network_lookup", + "customer_hint", + "end_user" + ], + "description": "`internal_address_book`: another Didit customer that proved control of the destination wallet. `wallet_attribution`: the wallet's blockchain analytics attribution. `network_lookup`: a network that can say which VASP holds the address. `customer_hint`: the VASP name, LEI or jurisdiction you sent in `beneficiary_data`. `end_user`: the counterparty the end user (or you) picked, or the request to pick one." }, - "webhook_version": { + "outcome": { "type": "string", "enum": [ - "v1", - "v2", - "v3" + "match", + "miss", + "skipped" ], - "description": "Payload version sent to this destination." + "description": "`match`: the step named a counterparty. `miss`: it ran and found none. `skipped`: it could not run, and `reason` says why." }, - "secret_shared_key": { + "reason": { "type": "string", - "description": "This destination's signing secret (43-character URL-safe token). Verify each webhook with the secret of the destination it was sent to. API-key callers always receive it in full; Console users without `read:webhooks` receive an empty string." + "description": "Machine-readable reason, `\"\"` on a match: `no_proven_internal_wallet`, `attribution_disabled`, `already_attributed`, `no_attributed_entity`, `directory_match_no_route`, `gtr_address_lookup_runs_on_dispatch`, `no_membership`, `network_switched_off`, `no_network_address_lookup`, `no_directory_match`, `awaiting_end_user` or `picked_member_without_proven_wallet`." }, - "subscribed_events": { - "type": "array", - "uniqueItems": true, - "description": "Event types delivered to this destination. Empty when the destination was created without events, in which case it receives nothing.", - "items": { - "$ref": "#/components/schemas/WebhookEvent" - } + "vasp": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The directory VASP the step named, when it named one." }, - "created_at": { + "rail": { "type": "string", - "format": "date-time" + "nullable": true, + "description": "The rail that reaches that counterparty, when the step found one." }, - "updated_at": { + "at": { "type": "string", "format": "date-time" } } }, - "WebhookConfig": { + "TravelRuleNextAction": { "type": "object", - "description": "Application-level webhook configuration, retention policy and Digital ID wallet return hosts, with every webhook destination.", - "required": [ - "webhook_url", - "webhook_version", - "secret_shared_key", - "capture_method", - "data_retention_months", - "face_retention_policy", - "face_retention_days", - "available_events", - "allowed_return_hosts", - "endpoints" - ], + "description": "One thing that moves a `COUNTERPARTY_VASP_NOT_FOUND` or `COUNTERPARTY_VASP_NOT_REACHABLE` transfer on. See [Why a transfer is stuck](/transaction-monitoring/travel-rule#why-a-transfer-is-stuck).", "properties": { - "webhook_url": { - "type": "string", - "format": "uri", - "nullable": true, - "description": "Application-level (legacy) webhook URL. Didit sends to it only while the application has no enabled destination, and then only `status.updated` and `data.updated`. Every create, update or delete of a destination sets it to the URL of the oldest enabled destination, or `null` when none is enabled." - }, - "webhook_version": { + "action": { "type": "string", "enum": [ - "v1", - "v2", - "v3" + "select_counterparty_vasp", + "declare_self_hosted", + "add_vasp_hint", + "update_compliance_email", + "resend" ], - "description": "Payload version of the legacy `webhook_url`. Each destination has its own `webhook_version`." + "description": "`select_counterparty_vasp`: the end user picks the destination VASP in the wallet-ownership widget, or you PATCH `action=beneficiary_vasp`. `declare_self_hosted`: the end user declares the wallet self-hosted in the widget. `add_vasp_hint`: tell Didit who the counterparty is, with a VASP name, LEI or travel address (for example a `travel_address` on the destination wallet's address-book entry), then resend. `update_compliance_email` and `resend` are `action` values of `PATCH /v3/transactions/{transaction_id}/travel-rule/`: give the counterparty's compliance email again, and re-run routing." }, - "secret_shared_key": { + "url": { "type": "string", - "description": "Application-level signing secret (43-character URL-safe token). It signs only deliveries to the legacy `webhook_url`; each destination signs with its own `secret_shared_key`. API-key callers always receive it in full; Console users without `read:webhooks` receive an empty string." - }, - "capture_method": { + "format": "uri", + "description": "The wallet-ownership widget link, on `select_counterparty_vasp` and `declare_self_hosted` while the transfer has an open widget session." + } + }, + "required": [ + "action" + ] + }, + "TransactionTravelRule": { + "type": "object", + "description": "A transaction's Travel Rule transfer, as `GET /v3/transactions/{transaction_id}/`, the `201` of `POST /v3/transactions/` and each row of `GET /v3/transactions/` return it. `direction`, `rail`, `counterparty_vasp`, `delivery`, `discovery`, `reason` and `next_actions` have the same shape as on `PATCH /v3/transactions/{transaction_id}/travel-rule/`, so one read of a transaction says why its transfer is stuck and what moves it on.", + "properties": { + "uuid": { "type": "string", - "enum": [ - "MOBILE", - "MOBILE_AND_DESKTOP" - ], - "description": "Legacy application setting. The verification flow does not read it: capture options are configured per workflow." + "format": "uuid" }, - "data_retention_months": { - "type": "integer", - "nullable": true, - "minimum": 1, - "maximum": 120, - "description": "Automatic deletion window. User verification sessions created more than this many months ago (a month counts as 30 days) are deleted automatically, and that deletion is irreversible. `null` means sessions are never deleted automatically. See [Data retention](https://docs.didit.me/console/data-retention)." + "status": { + "type": "string" }, - "face_retention_policy": { + "protocol": { "type": "string", - "enum": [ - "delete_with_session", - "retain_until_user_deleted" - ], - "description": "What happens to a session's face embedding when the session is deleted. `delete_with_session` (default) deletes it with the session. `retain_until_user_deleted` is the opt-in [biometric template retention](https://docs.didit.me/console/data-retention#biometric-template-retention): an image-free biometric template linked to the User is managed separately until its retention period ends, the User is deleted, or you purge it." + "nullable": true }, - "face_retention_days": { - "type": "integer", + "required": { + "type": "boolean" + }, + "obligations_count": { + "type": "integer" + }, + "originator_data": { + "type": "object", + "description": "Originator party. For an inbound transfer the counterparty's values are masked until ownership is confirmed." + }, + "beneficiary_data": { + "type": "object", + "description": "Beneficiary party. For an inbound transfer the counterparty's values are masked until ownership is confirmed." + }, + "name_match": { + "type": "object", "nullable": true, - "minimum": 1, - "maximum": 3650, - "description": "Retention period, in days, of biometric templates under `retain_until_user_deleted`. Required when that policy is set." + "description": "The name comparison that decided the transfer (score and strictness). Null until one ran. The compared names are masked together with the parties." }, - "biometric_consent_mode": { + "data_match": { + "$ref": "#/components/schemas/TravelRuleDataMatch" + }, + "mismatched_fields": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Shortcut for `data_match.mismatched_fields`. Empty when nothing differs." + }, + "data_unmasked": { + "$ref": "#/components/schemas/TravelRuleDataUnmasked" + }, + "data_masked": { + "type": "boolean", + "description": "True while the counterparty's personal data is masked in this response." + }, + "metadata": { + "type": "object" + }, + "direction": { "type": "string", "enum": [ - "auto", - "always", - "never" + "INBOUND", + "OUTBOUND" ], - "description": "When the hosted flow and the native SDKs ask the person for explicit biometric consent before a face capture. `auto` (default) asks only where a trigger applies: a declared state, the person's IP, or the identity document's issuer is in Illinois, Texas or Colorado, or the person looks to be in the US without a known state. `always` asks every person whose workflow captures a face. `never` never shows the step, and you collect consent yourself before the selfie. Each change is recorded in the audit log. See [Biometric consent](https://docs.didit.me/getting-started/biometric-consent)." + "description": "Which side of the exchange this transfer is." }, - "available_events": { - "type": "array", - "description": "Every event type a destination can subscribe to, with a display label.", - "items": { - "type": "object", - "required": [ - "value", - "label" - ], - "properties": { - "value": { - "$ref": "#/components/schemas/WebhookEvent" - }, - "label": { - "type": "string", - "description": "Display label, for example `Session status updated`." + "rail": { + "type": "string", + "nullable": true, + "description": "The rail the transfer went over: `INTERNAL`, `TRP`, `GTR`, `TRUST`, `VERIFYVASP`, `SYGNA` or `EMAIL` (`TEST_VASP` on a sandbox application, when the Didit Test VASP answered), or `null` until a rail is chosen." + }, + "counterparty_vasp": { + "type": "object", + "nullable": true, + "properties": { + "name": { + "type": "string" + }, + "lei": { + "type": "string" + }, + "dd_score": { + "type": "integer", + "description": "Due-diligence score from 0 to 100, where higher is better. Same scale as in the VASP directory." + }, + "dd_score_breakdown": { + "type": "object", + "description": "Per-component contributions to dd_score, one object per component as in the VASP directory (jurisdiction, verification, protocol, lei, history, essentials, responsiveness), each {points, max, reason, detail}. {} until the counterparty has been assessed.", + "additionalProperties": { + "type": "object", + "properties": { + "points": { + "type": "number", + "description": "Points awarded for this component." + }, + "max": { + "type": "integer", + "description": "Maximum points this component can award." + }, + "reason": { + "type": "string", + "description": "Machine-readable code of the component's verdict." + }, + "detail": { + "type": "string", + "description": "Human-readable reason for the awarded points." + } + } } + }, + "dd_assessed_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the due-diligence assessment last ran. Null until the counterparty has been assessed." } - } + }, + "description": "The counterparty's directory entry, or `null` when the transfer links none." }, - "allowed_return_hosts": { + "delivery": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/TravelRuleDelivery" + } + ], + "description": "The newest message the transfer owes another party. `null` when it has owed none, for example below `threshold_amount` or for a declared self-hosted wallet." + }, + "discovery": { "type": "array", - "maxItems": 20, - "description": "Hostnames (exact match, HTTPS only) a standalone Digital ID wallet verification may send the user back to with its `return_url`. Your white-label domain is always allowed as well. See [Register your return destination](https://docs.didit.me/standalone-apis/digital-id-wallets#register-your-return-destination).", + "description": "How Didit looked for the counterparty, one entry per step that ran. Empty when no discovery ran, for example on an inbound transfer.", "items": { - "type": "string", - "maxLength": 253 + "$ref": "#/components/schemas/TravelRuleDiscoveryStep" } }, - "endpoints": { + "reason": { + "type": "string", + "description": "Why a `COUNTERPARTY_VASP_NOT_FOUND` or `COUNTERPARTY_VASP_NOT_REACHABLE` transfer is stuck; `\"\"` for any other status. A failed delivery decides it first, on `COUNTERPARTY_VASP_NOT_REACHABLE` only: `email_undeliverable` (the mail provider refused the compliance email and no address is left to try: when it was sent, on a reminder, or as a permanent bounce reported later) or `delivery_failed` (the rail that was delivering failed for good: a network rail refused the message or ran out of retries, a `TRP` identity host did not answer, or the counterparty's `TRP` host did not accept the inquiry). Otherwise the `discovery` trace decides it: `awaiting_end_user` (no step named a counterparty Didit can reach), `directory_match_no_route` (a step named a directory VASP that has no route), `picked_member_without_proven_wallet` (the end user picked a Didit customer that has not proven control of the wallet), or `no_directory_match` when the trace gives no other reason. A resend moves the transfer on, so the reason clears. See [Why a transfer is stuck](/transaction-monitoring/travel-rule#why-a-transfer-is-stuck)." + }, + "next_actions": { "type": "array", - "description": "Every webhook destination of the application, oldest first, each with its signing secret. Read only here: manage destinations with the `/v3/webhook/destinations/` endpoints.", + "description": "What moves the transfer on; `[]` for any status but `COUNTERPARTY_VASP_NOT_FOUND` or `COUNTERPARTY_VASP_NOT_REACHABLE`. `email_undeliverable` offers `update_compliance_email`, then `resend`. `delivery_failed` offers `resend`. A discovery reason offers `select_counterparty_vasp`, `declare_self_hosted`, `add_vasp_hint` and `resend`.", "items": { - "$ref": "#/components/schemas/WebhookConfigDestination" + "$ref": "#/components/schemas/TravelRuleNextAction" } + }, + "chain_details": { + "$ref": "#/components/schemas/TravelRuleChainDetails" } } }, - "WebhookDestinationDelivery": { + "NetworkListCounts": { "type": "object", - "description": "One delivery attempt to a webhook destination. The first send of an event, each automatic retry and each resend are separate deliveries.", - "required": [ - "uuid", - "session_id", - "request_url", - "response_status", - "response_time_ms", - "status", - "webhook_type", - "created_at" - ], + "description": "Network counts for the list's views and filter options, each network counted once. Returned only when `summary` is not `false`. `scopes` count every network visible to the application. `views` count the visible networks inside the selected `scope`. `facets` count the networks in the selected `scope` and `status` view (dismissed networks are left out unless `status` includes them). The other list filters do not change these counts.", "properties": { - "uuid": { - "type": "string", - "format": "uuid", - "description": "Delivery ID, for the detail and resend calls." - }, - "session_id": { - "type": "string", - "format": "uuid", - "nullable": true, - "description": "User verification session the event is about. `null` for business session, user, business, transaction, Travel Rule and workflow events." - }, - "request_url": { - "type": "string", - "format": "uri", - "nullable": true, - "description": "URL the delivery was sent to: the destination's URL when the event was generated." - }, - "response_status": { - "type": "integer", - "nullable": true, - "description": "HTTP status your endpoint returned. `null` while the delivery is queued and not yet attempted. When no HTTP answer was received Didit records a status of its own: `504` when your endpoint did not answer within 5 seconds, `503` for a connection failure, `400` when the URL was refused as unsafe (for example a private or internal address), and `404` for any other request error. `400` or above counts as a failed delivery." - }, - "response_time_ms": { - "type": "integer", - "nullable": true, - "minimum": 0, - "description": "Time the attempt took, in milliseconds. `null` while the delivery is queued." - }, - "status": { - "type": "string", - "nullable": true, - "description": "Status the event reported when it was generated: the session status for session events (for example `Approved` or `In Review`), the person's or company's status for user and business events, and the transaction status for transaction events. `null` for events that carry no status." + "scopes": { + "type": "object", + "description": "Visible networks by product.", + "properties": { + "all": { + "type": "integer" + }, + "identity": { + "type": "integer", + "description": "Every other network." + }, + "transactions": { + "type": "integer", + "description": "Networks whose members are all transaction parties." + } + } }, - "webhook_type": { - "$ref": "#/components/schemas/WebhookEvent" + "views": { + "type": "object", + "description": "Visible networks inside the selected `scope`, by status, plus two saved views.", + "properties": { + "all": { + "type": "integer" + }, + "active": { + "type": "integer" + }, + "in_review": { + "type": "integer" + }, + "resolved": { + "type": "integer" + }, + "dismissed": { + "type": "integer" + }, + "mine": { + "type": "integer", + "description": "Networks assigned to the calling console member. Always 0 for an API key." + }, + "high_risk": { + "type": "integer", + "description": "Networks with a risk score of 80 or more that are not dismissed." + } + } }, - "created_at": { - "type": "string", - "format": "date-time", - "description": "When the delivery was created." + "facets": { + "type": "object", + "description": "Counts for each filter option, inside the selected `scope` and status view.", + "properties": { + "total": { + "type": "integer", + "description": "Networks in the selected `scope` and status view." + }, + "last_activity_days": { + "type": "object", + "description": "Networks with activity in the last 7, 30 and 90 days, keyed by the number of days.", + "properties": { + "7": { + "type": "integer" + }, + "30": { + "type": "integer" + }, + "90": { + "type": "integer" + } + } + }, + "risk_min": { + "type": "object", + "description": "Networks with a risk score of at least 50 and at least 80, keyed by the threshold.", + "properties": { + "50": { + "type": "integer" + }, + "80": { + "type": "integer" + } + } + }, + "signal_types": { + "type": "object", + "description": "Networks with at least one signal of each type.", + "properties": { + "ip_address": { + "type": "integer" + }, + "device": { + "type": "integer" + }, + "face": { + "type": "integer" + }, + "document_number": { + "type": "integer" + }, + "phone": { + "type": "integer" + }, + "email": { + "type": "integer" + }, + "address": { + "type": "integer" + } + } + }, + "priority": { + "type": "object", + "description": "Networks by priority. `none` counts networks without a priority.", + "properties": { + "low": { + "type": "integer" + }, + "medium": { + "type": "integer" + }, + "high": { + "type": "integer" + }, + "none": { + "type": "integer" + } + } + }, + "assignee": { + "type": "object", + "description": "Networks by assignee.", + "properties": { + "me": { + "type": "integer", + "description": "Assigned to the calling console member. Always 0 for an API key." + }, + "unassigned": { + "type": "integer", + "description": "Assigned to nobody." + }, + "users": { + "type": "array", + "description": "One entry per assignee, most networks first.", + "items": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + }, + "full_name": { + "type": "string", + "description": "The assignee's name, or their email when no name is set." + }, + "email": { + "type": "string" + }, + "count": { + "type": "integer" + } + } + } + } + } + }, + "has_case": { + "type": "integer", + "description": "Networks this application opened a case for." + }, + "min_size": { + "type": "object", + "description": "Networks with at least 10 members, keyed by the minimum size.", + "properties": { + "10": { + "type": "integer" + } + } + } + } } } }, - "WebhookDestinationDeliveryDetail": { + "NetworkTag": { "type": "object", - "description": "One delivery attempt to a webhook destination, with the exact request headers and body Didit sent.", - "required": [ - "uuid", - "session_id", - "request_url", - "response_status", - "response_time_ms", - "status", - "webhook_type", - "created_at", - "request_header", - "request_body" - ], + "description": "One of your application's tags on the network.", "properties": { "uuid": { "type": "string", "format": "uuid", - "description": "Delivery ID, for the detail and resend calls." - }, - "session_id": { - "type": "string", - "format": "uuid", - "nullable": true, - "description": "User verification session the event is about. `null` for business session, user, business, transaction, Travel Rule and workflow events." - }, - "request_url": { - "type": "string", - "format": "uri", - "nullable": true, - "description": "URL the delivery was sent to: the destination's URL when the event was generated." - }, - "response_status": { - "type": "integer", - "nullable": true, - "description": "HTTP status your endpoint returned. `null` while the delivery is queued and not yet attempted. When no HTTP answer was received Didit records a status of its own: `504` when your endpoint did not answer within 5 seconds, `503` for a connection failure, `400` when the URL was refused as unsafe (for example a private or internal address), and `404` for any other request error. `400` or above counts as a failed delivery." + "description": "The tag's UUID, the same value you pass as `tag_uuid`." }, - "response_time_ms": { - "type": "integer", - "nullable": true, - "minimum": 0, - "description": "Time the attempt took, in milliseconds. `null` while the delivery is queued." + "name": { + "type": "string" }, - "status": { + "color": { "type": "string", - "nullable": true, - "description": "Status the event reported when it was generated: the session status for session events (for example `Approved` or `In Review`), the person's or company's status for user and business events, and the transaction status for transaction events. `null` for events that carry no status." - }, - "webhook_type": { - "$ref": "#/components/schemas/WebhookEvent" + "description": "Hex color, for example `#6366F1`." }, - "created_at": { + "source": { "type": "string", - "format": "date-time", - "description": "When the delivery was created." + "enum": [ + "didit", + "custom" + ], + "description": "`didit` for a Didit preset tag, `custom` for a tag your team created." }, - "request_header": { + "added_by": { "type": "string", - "description": "JSON text (a string) of the request headers Didit sent: `Content-Type`, `X-Signature`, `X-Signature-V2`, `X-Signature-Simple`, `X-Timestamp` and `User-Agent`. Parse it with a JSON parser. It holds signatures, never the signing secret." + "nullable": true, + "description": "Email of the console member who added the tag. Null when an API key added it." }, - "request_body": { + "added_at": { "type": "string", - "description": "JSON text (a string) of the exact payload Didit sent, keys sorted, including `event_id` and `timestamp`. Parse it with a JSON parser; see [Payload shape](https://docs.didit.me/integration/webhooks#payload-shape). For a scoped key without `media: read`, media URLs inside it are `null`; without `sessions: write`, session tokens and hosted verification links are `null`. A body changed that way no longer matches its signatures. Didit does not record the response body your endpoint returned." + "format": "date-time" } } }, - "SessionWebhookDelivery": { + "NetworkOutcomes": { "type": "object", - "description": "One webhook delivery attempt recorded for a verification session, with the exact request headers and body Didit sent.", - "required": [ - "uuid", - "session_id", - "request_url", - "response_status", - "status", - "webhook_type", - "request_header", - "request_body", - "created_at" - ], + "description": "Where the network's people and businesses stand. Each member you may see counts once, by the status of their most recent verification that reached a decision. Transaction parties are not counted.", "properties": { - "uuid": { - "type": "string", - "format": "uuid", - "description": "Delivery ID. Use it as `{webhook_uuid}` to get or resend this delivery." - }, - "session_id": { - "type": "string", - "format": "uuid", - "description": "The session the delivery belongs to (the session in the path)." - }, - "request_url": { - "type": "string", - "format": "uri", - "nullable": true, - "description": "URL the delivery was sent to." - }, - "response_status": { + "approved": { "type": "integer", - "nullable": true, - "description": "HTTP status your endpoint returned. `null` while the delivery is queued and not yet attempted. When no HTTP answer was received Didit records a status of its own: `504` when your endpoint did not answer within 5 seconds, `503` for a connection failure, `400` when the URL was refused as unsafe (for example a private or internal address), and `404` for any other request error. `400` or above counts as a failed delivery." - }, - "status": { - "type": "string", - "nullable": true, - "description": "Session status when the event was generated, for example `In Progress`, `Approved` or `Declined`." - }, - "webhook_type": { - "$ref": "#/components/schemas/WebhookEvent" + "description": "Members whose most recent decided verification was approved." }, - "request_header": { - "type": "string", - "description": "JSON text (a string) of the request headers Didit sent: `Content-Type`, `X-Signature`, `X-Signature-V2`, `X-Signature-Simple`, `X-Timestamp` and `User-Agent`. Parse it with a JSON parser. It holds signatures, never the signing secret." + "declined": { + "type": "integer", + "description": "Members whose most recent decided verification was declined." }, - "request_body": { - "type": "string", - "description": "JSON text (a string) of the exact payload Didit sent, keys sorted, including `event_id` and `timestamp`. Parse it with a JSON parser; see [Payload shape](https://docs.didit.me/integration/webhooks#payload-shape). For a scoped key without `media: read`, media URLs inside it are `null`; without `sessions: write`, session tokens and hosted verification links are `null`. A body changed that way no longer matches its signatures. Didit does not record the response body your endpoint returned." + "in_review": { + "type": "integer", + "description": "Members whose most recent decided verification is in review." }, - "created_at": { - "type": "string", - "format": "date-time", - "description": "When the delivery was created." + "total": { + "type": "integer", + "description": "Members with at least one verification, decided or not. A member whose verifications are all undecided (not started, in progress, expired or abandoned) counts here and in no other key." } } }, - "SessionEvent": { + "NetworkPatternScore": { "type": "object", - "description": "One entry of a verification session's event timeline.", - "required": [ - "uuid", - "event_type", - "created_at", - "component", - "feature_step", - "step", - "details", - "ip_address", - "user_agent", - "device_info", - "file_url", - "sent_at" - ], + "description": "How alike one kind of the members' data is across the whole network. A pattern is not a signal: no shared value links the members.", "properties": { - "uuid": { - "type": "string", - "format": "uuid", - "description": "Event identifier." - }, - "event_type": { + "type": { "type": "string", "enum": [ - "SESSION_CREATED", - "SESSION_COMPLETED", - "SESSION_STATUS_CHANGED", - "LINK_OPENED", - "FORM_SUBMITTED", - "BUTTON_CLICKED", - "FILE_UPLOADED", - "ATTEMPT_FAILED", - "FEATURE_STEP_CHANGED", - "STEP_RENDERED", - "NOTE_ADDED", - "MANUAL_REVIEW_STARTED", - "WORKFLOW_BRANCH_EVALUATED", - "WORKFLOW_STATUS_NODE_REACHED", - "LOG" + "background" ], - "description": "What happened. Reported by the device during the hosted flow or SDK: `LINK_OPENED`, `STEP_RENDERED`, `BUTTON_CLICKED`, `FORM_SUBMITTED`, `FILE_UPLOADED`, `ATTEMPT_FAILED` and `LOG` (debugging). Recorded by the server: `SESSION_CREATED`, `SESSION_STATUS_CHANGED` (`details.old_status`, `details.current_status`), `FEATURE_STEP_CHANGED` (`details.old_feature_step`, `details.current_feature_step`), `WORKFLOW_BRANCH_EVALUATED` and `WORKFLOW_STATUS_NODE_REACHED` (the workflow routing trace). `SESSION_COMPLETED`, `NOTE_ADDED` and `MANUAL_REVIEW_STARTED` can appear on older sessions." + "description": "`background`: the mean similarity of every pair of member selfie backgrounds, with the person masked out. It reads the newest selfie of each person, at most the 50 newest, and leaves out age assurance sessions. It covers the whole network, not only the members of your applications." }, - "created_at": { - "type": "string", - "format": "date-time", - "description": "When Didit stored the event. Events are stored asynchronously, a few seconds after `sent_at`." + "score": { + "type": "number", + "nullable": true, + "minimum": 0, + "maximum": 1, + "description": "From 0 to 1, rounded to 4 decimals. Null when `reason` is set." }, - "component": { - "type": "string", + "members": { + "type": "integer", "nullable": true, - "description": "UI component that reported the event (device events only)." + "description": "How many members' selfies the score compared. A selfie that cannot be read, or shows too little background, is not compared. Null while `computing`; 0 or 1 with `not_enough_selfies`." }, - "feature_step": { + "reason": { "type": "string", - "nullable": true, "enum": [ - "OCR", - "OCR_BACK", - "NFC", - "AML", - "FACE", - "LIVENESS", - "FACE_MATCH", - "IP_ANALYSIS", - "AGE_ESTIMATION", - "PROOF_OF_ADDRESS", - "PHONE_VERIFICATION", - "EMAIL_VERIFICATION", - "FACE_SEARCH", - "DATABASE_VALIDATION", - "QUESTIONNAIRE", - "KYB_REGISTRY", - "KYB_DOCUMENTS", - "KYB_KEY_PEOPLE", - "DOCUMENT_AI", - "GEOLOCATION", - null + "computing", + "not_enough_selfies" ], - "description": "Verification feature the session was on when the event happened." - }, - "step": { - "type": "string", - "nullable": true, - "description": "Screen within the feature, for example `DOCUMENT_CAPTURE_FRONT` or `FACE_PASSIVE_LIVENESS`." - }, - "details": { - "type": "object", - "nullable": true, - "additionalProperties": true, - "description": "Event-specific data. The keys depend on `event_type`." - }, - "ip_address": { - "type": "string", "nullable": true, - "description": "IP address the device reported the event from. `null` for server-recorded events." + "description": "Why there is no score. `computing`: the score for the current members is being computed; read the network again later. `not_enough_selfies`: fewer than two members have a usable selfie. Null when there is a score." }, - "user_agent": { + "computed_at": { "type": "string", + "format": "date-time", "nullable": true, - "description": "User agent of the device. `null` for server-recorded events." + "description": "When the score was computed. Null while `computing`." + } + } + }, + "NetworkDetailResponse": { + "description": "The network detail, plus the organization's sharing mode, whether cross-organization signals apply to it, your application's tags on the network, member outcomes and pattern scores.", + "allOf": [ + { + "$ref": "#/components/schemas/NetworkDetail" }, - "device_info": { + { "type": "object", - "nullable": true, - "additionalProperties": true, - "description": "Device details the SDK or browser reported." - }, - "file_url": { - "type": "string", - "format": "uri", - "nullable": true, - "description": "Short-lived presigned link to a file attached to the event (for example a captured image). `null` when there is none, and always `null` for a scoped API key without `media: read`." - }, - "sent_at": { - "type": "integer", - "format": "int64", - "description": "When the event happened, as a Unix timestamp in milliseconds. Results are ordered by it." + "properties": { + "sharing_mode": { + "type": "string", + "enum": [ + "off", + "private", + "global" + ], + "description": "The organization's cross-organization sharing mode. Only `global` compares networks across organizations; `private` and `off` keep them to the organization's own history.", + "example": "global" + }, + "cross_org_available": { + "type": "boolean", + "description": "Whether cross-organization signals apply to this organization. They need both the Enterprise plan and the `global` sharing mode.", + "example": true + }, + "cross_org_unavailable_reason": { + "type": "string", + "enum": [ + "plan", + "sharing_mode" + ], + "nullable": true, + "description": "Why cross-organization signals do not apply, checked in this order. `plan`: the organization's plan does not include the cross-organization fraud network (it needs the Enterprise plan), whatever the sharing mode. `sharing_mode`: the plan includes it, but the sharing mode is `private` or `off`. Null when `cross_org_available` is `true`.", + "example": null + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NetworkTag" + }, + "description": "Your application's tags on the network, oldest first. Each application sees only its own tags. `fraud_tags` is separate and unchanged: the tags the network's members carry." + }, + "outcomes": { + "$ref": "#/components/schemas/NetworkOutcomes" + }, + "patterns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NetworkPatternScore" + }, + "description": "Pattern scores over the whole network. Today one item, `background`." + } + } } - } + ] }, - "AMLDatasetSourceFreshness": { + "NetworkTagRequest": { "type": "object", - "description": "Freshness of one family of AML datasets.", "required": [ - "last_updated_at", - "oldest_updated_at", - "dataset_count", - "dated_dataset_count" + "tag_uuid" ], "properties": { - "last_updated_at": { - "type": "string", - "format": "date-time", - "description": "Most recent update of any dataset in the family." - }, - "oldest_updated_at": { + "tag_uuid": { "type": "string", - "format": "date-time", - "nullable": true, - "description": "Staleness bound: every dataset in the family is at least this current. `null` when at least one dataset in the family reported no update date, because the bound is then unknown." - }, - "dataset_count": { - "type": "integer", - "description": "Number of datasets in the family." - }, - "dated_dataset_count": { - "type": "integer", - "description": "Number of those datasets that reported an update date." + "format": "uuid", + "description": "UUID of one of your application's tags." } + }, + "example": { + "tag_uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7" } }, - "AMLDatasetFreshness": { + "NetworkTimeline": { + "title": "Default timeline (no contract)", "type": "object", - "description": "How current the AML datasets were when a screening ran. Dates are never estimated.", - "required": [ - "captured_at", - "provider", - "catalog_version", - "sources" - ], + "description": "Without `contract`: the network's own events, oldest first, not paginated.", "properties": { - "captured_at": { - "type": "string", - "format": "date-time", - "description": "When Didit read the dataset catalog this freshness comes from." - }, - "provider": { - "type": "string", - "description": "Opaque identifier of the AML data source. Treat it as an opaque string; do not branch on it.", - "example": "aml_data_source" + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NetworkTimelineEvent" + } + } + } + }, + "NetworkTimelinePage": { + "title": "Typed timeline page (contract=2)", + "type": "object", + "description": "With `contract=2`: one page of typed events, newest first.", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NetworkTypedTimelineEvent" + } }, - "catalog_version": { + "next_cursor": { "type": "string", "nullable": true, - "description": "Version identifier of the dataset catalog, when the source reports one." - }, - "sources": { - "type": "object", - "description": "Freshness per dataset family. A family whose datasets reported no update date is absent rather than filled with `null`.", - "properties": { - "sanctions": { - "$ref": "#/components/schemas/AMLDatasetSourceFreshness" - }, - "pep": { - "$ref": "#/components/schemas/AMLDatasetSourceFreshness" - }, - "warnings": { - "$ref": "#/components/schemas/AMLDatasetSourceFreshness" - }, - "adverse_media": { - "$ref": "#/components/schemas/AMLDatasetSourceFreshness" - } - } + "description": "Pass as `cursor` to read the next page. Null on the last page." } } }, - "AMLScreeningRun": { + "NetworkTypedTimelineEvent": { "type": "object", - "description": "One completed ongoing-monitoring re-screen of an AML check.", - "required": [ - "uuid", - "completed_at", - "started_at", - "outcome", - "trigger", - "provider", - "status", - "score", - "total_hits", - "dataset_freshness" - ], + "description": "One typed timeline event: the four default fields, plus its id, when Didit stored it, the member account and record it belongs to, and the detail block of its event type. The other detail blocks are null.", "properties": { - "uuid": { + "id": { "type": "string", - "format": "uuid", - "description": "Identifier of this screening run." + "description": "`:`, unique within the timeline.", + "example": "session:3fa85f64-5717-4562-b3fc-2c963f66afa6" }, - "completed_at": { + "event_type": { + "type": "string", + "enum": [ + "network_detected", + "signal_observed", + "network_active", + "network_in_review", + "network_resolved", + "network_dismissed", + "verification_attempt", + "transaction", + "login", + "rule_hit", + "case_linked", + "note_added" + ] + }, + "occurred_at": { "type": "string", "format": "date-time", - "description": "When this subject's re-screen finished. Results are ordered by it, newest first." + "description": "When it happened." }, - "started_at": { + "ingested_at": { "type": "string", "format": "date-time", - "description": "When the monitoring batch this re-screen belongs to started." + "description": "When Didit stored it." }, - "outcome": { + "label": { "type": "string", - "enum": [ - "NO_CHANGE", - "CHANGED", - "FAILED" + "description": "A short English label, for example `Verification attempt 2 of 3`." + }, + "metadata": { + "type": "object", + "description": "For the network's own events, the same metadata as the default timeline. Empty otherwise." + }, + "account": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineAccount" + } ], - "description": "`NO_CHANGE`: completed and the result did not move. `CHANGED`: completed and the score, status, hit count or hits changed. `FAILED`: no usable answer for this subject, so the check was left as it was." + "nullable": true, + "description": "The member account. Null for the network's own events, `case_linked` and `note_added`." }, - "trigger": { - "type": "string", - "enum": [ - "ONGOING_MONITORING" + "source_ref": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineSourceRef" + } ], - "description": "What started the screening. Always `ONGOING_MONITORING` today." + "nullable": true, + "description": "The source record. Null for the network's own events and `note_added`." }, - "provider": { - "type": "string", - "description": "Opaque identifier of the AML data source that answered. Treat it as an opaque string; do not branch on it.", - "example": "aml_data_source" + "verification_attempt": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineAttempt" + } + ], + "nullable": true, + "description": "Set on `verification_attempt` events." }, - "status": { - "type": "string", + "transaction": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineTransaction" + } + ], "nullable": true, - "enum": [ - "Not Finished", - "Approved", - "Declined", - "In Review", - "Resub Requested", - null + "description": "Set on `transaction` events." + }, + "login": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineLogin" + } ], - "description": "AML check status this run left the check in." + "nullable": true, + "description": "Set on `login` events." }, - "score": { - "type": "number", - "format": "float", + "rule_hit": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineRuleHit" + } + ], "nullable": true, - "minimum": 0, - "maximum": 100, - "description": "AML score this run left the check in." + "description": "Set on `rule_hit` events." }, - "total_hits": { - "type": "integer", + "case_linked": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineCaseLinked" + } + ], "nullable": true, - "description": "Number of hits this run left the check in." + "description": "Set on `case_linked` events." }, - "dataset_freshness": { + "note_added": { "allOf": [ { - "$ref": "#/components/schemas/AMLDatasetFreshness" + "$ref": "#/components/schemas/NetworkTimelineNoteAdded" } ], "nullable": true, - "description": "Dataset freshness behind this run, or `null` when no dates were available." + "description": "Set on `note_added` events. Never returned to an API key." } } }, - "KYBKeyPeopleParty": { + "NetworkTimelineAccount": { "type": "object", - "description": "A Key People party of a Business Verification (KYB) session, with its child verification. The same party appears in `key_people_checks[].submitted.parties[]` of the business session decision.", - "required": [ - "uuid", - "entity_type", - "source", - "name", - "is_active", - "is_skipped", - "requires_verification", - "roles", - "kyc_session_deleted", - "kyb_sub_session_deleted" - ], + "description": "The member account the event belongs to.", "properties": { - "uuid": { + "node_id": { "type": "string", - "format": "uuid", - "description": "Party identifier." + "description": "`:`, where kind is `vendor_user`, `vendor_business` or `transaction_party`.", + "example": "vendor_user:3fa85f64-5717-4562-b3fc-2c963f66afa6" }, - "entity_type": { + "node_type": { "type": "string", "enum": [ - "person", - "company" - ], - "description": "Whether the party is an individual or a company." + "account", + "business_account", + "transaction_party" + ] }, - "source": { + "uuid": { "type": "string", - "enum": [ - "REGISTRY", - "USER" - ], - "description": "`REGISTRY`: taken from the company registry. `USER`: entered in the Key People screen." + "format": "uuid" }, - "name": { + "vendor_data": { "type": "string", - "description": "Display name of the party." + "nullable": true }, - "first_name": { + "display_name": { "type": "string", - "nullable": true, - "description": "First name (persons)." + "nullable": true }, - "last_name": { + "ownership": { "type": "string", - "nullable": true, - "description": "Last name (persons)." + "enum": [ + "owned", + "organization" + ], + "description": "`owned` when the record belongs to the application you called (for a console member, to an application they were granted). `organization` when it belongs to another application of your organization." }, - "company_name": { + "route": { + "$ref": "#/components/schemas/NetworkTimelineRoute" + } + } + }, + "NetworkTimelineSourceRef": { + "type": "object", + "description": "The record the event was read from.", + "properties": { + "kind": { "type": "string", - "nullable": true, - "description": "Company name (company parties)." + "enum": [ + "session", + "business_session", + "transaction", + "monitoring_event", + "case" + ] }, - "registration_number": { + "id": { "type": "string", - "nullable": true, - "description": "Company registration number (company parties)." + "format": "uuid" }, - "email": { + "ownership": { "type": "string", - "format": "email", - "nullable": true, - "description": "Email the verification link is sent to." + "enum": [ + "owned", + "organization" + ], + "description": "`owned` when the record belongs to the application you called (for a console member, to an application they were granted). `organization` when it belongs to another application of your organization." }, - "nationality": { + "route": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineRoute" + } + ], + "description": "Absent for `monitoring_event` and `case`." + } + } + }, + "NetworkTimelineRoute": { + "type": "object", + "description": "Where the record opens: its kind, its UUID and the application it belongs to.", + "properties": { + "kind": { "type": "string", - "nullable": true, - "description": "Nationality for persons, country of incorporation for companies." + "description": "`user`, `business` or `transaction_party` for an account; `session`, `business_session` or `transaction` for a source record." }, - "phone_number": { + "id": { "type": "string", - "nullable": true, - "description": "Phone number collected for the party." + "format": "uuid" }, - "date_of_birth": { + "application_id": { "type": "string", - "format": "date", - "nullable": true, - "description": "Date of birth (persons)." - }, - "position": { + "format": "uuid" + } + } + }, + "NetworkTimelineAttempt": { + "type": "object", + "description": "One verification session of the account.", + "properties": { + "session_id": { "type": "string", - "nullable": true, - "description": "Free-text job title (persons)." + "format": "uuid", + "description": "The session UUID, or the business session UUID for a company." }, - "custom_fields": { - "type": "object", - "additionalProperties": true, - "description": "Workflow-defined custom fields collected for the party, keyed by field key." + "session_number": { + "type": "integer", + "nullable": true }, - "is_active": { - "type": "boolean", - "description": "Whether the party is active." + "attempt": { + "type": "integer", + "description": "This session's position among the account's sessions, in creation order." }, - "is_skipped": { - "type": "boolean", - "description": "Whether the party is exempt from verification. Regenerating clears it." + "attempt_count": { + "type": "integer", + "description": "How many sessions the account has." }, - "requires_verification": { - "type": "boolean", - "description": "Whether the role and ownership rules require a verification for this party." + "status": { + "type": "string", + "description": "The session status, for example `Approved` or `Declined`." }, - "roles": { + "status_changed_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "decline_reasons": { "type": "array", - "description": "Roles the party holds in the company.", "items": { - "type": "object", - "required": [ - "role", - "ownership_percent", - "voting_percent" - ], - "properties": { - "role": { - "type": "string", - "enum": [ - "director", - "non_executive_director", - "secretary", - "chairman", - "ubo", - "shareholder", - "representative", - "founder", - "legal_advisor", - "authorized_signatory", - "trustee", - "beneficiary", - "settlor", - "protector", - "company_officer", - "investor", - "other" - ], - "description": "Role code." - }, - "ownership_percent": { - "type": "number", - "nullable": true, - "description": "Ownership percentage for this role, when known." - }, - "voting_percent": { - "type": "number", - "nullable": true, - "description": "Voting-rights percentage for this role, when known." - } - } - } - }, - "kyc_session_id": { + "$ref": "#/components/schemas/NetworkTimelineDeclineReason" + }, + "description": "For a declined session only: its warnings, oldest first, once per warning. Empty otherwise." + } + } + }, + "NetworkTimelineDeclineReason": { + "type": "object", + "properties": { + "risk": { "type": "string", - "format": "uuid", - "nullable": true, - "description": "Child individual KYC session (persons)." + "description": "The warning code." }, - "kyc_session_status": { + "feature": { "type": "string", - "nullable": true, - "enum": [ - "Not Started", - "In Progress", - "Approved", - "Declined", - "In Review", - "Expired", - "Abandoned", - "Kyc Expired", - "Resubmitted", - "Awaiting User", - null - ], - "description": "Status of the child KYC session. A deleted session keeps the status it had when it was deleted." + "description": "The feature that raised the warning." }, - "kyc_session_url": { + "short_description": { + "type": "string" + } + } + }, + "NetworkTimelineTransaction": { + "type": "object", + "description": "A transaction a member account took part in, dated by its transaction date.", + "properties": { + "transaction_id": { "type": "string", - "format": "uri", - "nullable": true, - "description": "Hosted link of the child KYC session. `null` when there is none or it was deleted, and for a scoped API key without `sessions: write`." + "format": "uuid" }, - "kyc_session_deleted": { - "type": "boolean", - "description": "The child KYC session was deleted, so it can never settle." + "transaction_number": { + "type": "integer", + "nullable": true }, - "kyb_sub_session_id": { - "type": "string", - "format": "uuid", - "nullable": true, - "description": "Child KYB session (company parties)." + "transaction_type": { + "type": "string" }, - "kyb_sub_session_status": { - "type": "string", - "nullable": true, - "enum": [ - "Not Started", - "In Progress", - "Approved", - "Declined", - "In Review", - "Expired", - "Abandoned", - "Kyc Expired", - "Resubmitted", - "Awaiting User", - null - ], - "description": "Status of the child KYB session." + "action_type": { + "type": "string" }, - "kyb_sub_session_url": { - "type": "string", - "format": "uri", + "amount": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineAmount" + } + ], "nullable": true, - "description": "Hosted link of the child KYB session, with the same `null` rules as `kyc_session_url`." - }, - "kyb_sub_session_deleted": { - "type": "boolean", - "description": "Company-party counterpart of `kyc_session_deleted`." + "description": "Null when the transaction has no amount." }, - "verification_workflow_type": { - "type": "string", - "nullable": true, - "enum": [ - "kyc", - "kyb", - "adaptive_age_verification", - "biometric_authentication", - "address_verification", - "questionnaire_verification", - "email_verification", - "phone_verification", - null - ], - "description": "Type of the workflow the child session runs." + "status": { + "type": "string" }, - "verification_workflow_id": { + "decision_reason_code": { "type": "string", - "format": "uuid", - "nullable": true, - "description": "Workflow the child session runs." + "nullable": true }, - "verification_workflow_label": { + "decision_reason_label": { "type": "string", - "nullable": true, - "description": "Label of that workflow." - }, - "verification_workflow_features": { - "type": "array", - "nullable": true, - "description": "Features of the child session's workflow with their current status.", - "items": { - "type": "object", - "required": [ - "feature", - "status" - ], - "properties": { - "feature": { - "type": "string", - "description": "Feature code, for example `ID_VERIFICATION` or `LIVENESS`." - }, - "status": { - "type": "string", - "description": "Feature status, `Not Finished` until it runs." - } - } - } + "nullable": true }, - "didit_internal_id": { + "party_role": { "type": "string", - "format": "uuid", - "nullable": true, - "description": "Didit's identifier of the verified person, once known." + "description": "The account's role in the transaction: `APPLICANT`, `REMITTER`, `BENEFICIARY` or `COUNTERPARTY`." } } }, - "TravelRuleDelivery": { + "NetworkTimelineAmount": { "type": "object", - "description": "Where the latest message the transfer owes the other side stands. Didit contacts the counterparty after the request that created or changed the transfer has returned, so this object says whether that message got through: queued, being sent, waiting to be retried after an error, delivered, or failed. A failure the network may still recover from (no answer in time, a failed connection, HTTP `408`, `429` or `5xx`) is tried again after 30 seconds, 2 minutes, 10 minutes, 30 minutes and 1 hour. When a first message (`kind: SEND`) fails for good, because the network refused it or the sixth attempt failed too, the transfer moves to `COUNTERPARTY_VASP_NOT_REACHABLE` with `last_error` in its `timeline`; any other message that fails for good is noted in the `timeline`. The transfer's `status` stays the source of truth for the exchange itself.", - "required": [ - "kind", - "status", - "rail", - "attempts", - "last_error", - "next_attempt_at", - "delivered_at" - ], "properties": { - "kind": { + "value": { "type": "string", - "enum": [ - "SEND", - "ANSWER", - "TXID", - "CANCEL", - "POLL" - ], - "description": "What the message carries. `SEND`: the transfer's first message to the counterparty (outbound; the rail is chosen when it is sent). `ANSWER`: your accept or decline, owed to the network that asked (inbound). `TXID`: the on-chain transaction hash, after you finish the transfer. `CANCEL`: the cancellation, after you cancel it. `POLL`: a status query to a network that offers one, repeated every 5 minutes while the transfer waits on the counterparty." + "description": "Decimal amount as a string." }, - "status": { - "type": "string", - "enum": [ - "QUEUED", - "SENDING", - "RETRYING", - "DELIVERED", - "FAILED" - ], - "description": "`QUEUED`: waiting to be sent. `SENDING`: an attempt is running. `RETRYING`: an attempt failed and the next one runs at `next_attempt_at`. `DELIVERED`: the other side took the message. `FAILED`: the other side refused it, or the last attempt failed." + "currency": { + "type": "string" }, - "rail": { + "direction": { "type": "string", - "enum": [ - "INTERNAL", - "TRP", - "GTR", - "TRUST", - "VERIFYVASP", - "SYGNA", - "EMAIL", - "" - ], - "description": "The rail that carries the message. Empty until Didit has chosen one for a first message." + "nullable": true + } + } + }, + "NetworkTimelineLogin": { + "type": "object", + "description": "A sign-in event you posted for a person through the events API.", + "properties": { + "action": { + "type": "string", + "description": "`.`: `auth.login` or `security.login_succeeded` for a sign-in, `auth.login_failed` or `security.login_failed` for a failed one." }, - "attempts": { - "type": "integer", - "minimum": 0, - "description": "Attempts made so far for this message. A message that is not a status poll is attempted at most 6 times." + "succeeded": { + "type": "boolean" }, - "last_error": { + "status": { "type": "string", - "description": "The kind of failure the last attempt hit, `\"\"` when none did: for example `email undeliverable`, `trp identity endpoint unreachable` or `trp transfer inquiry delivery failed`. It never carries the counterparty's own answer, which stays on the transfer's `timeline`.\nWhen GTR answers with an error, its own status code and message are included. Response bodies are never included.", - "example": "email undeliverable" + "description": "The event's status." }, - "next_attempt_at": { - "type": "string", - "format": "date-time", + "ip": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineIP" + } + ], "nullable": true, - "description": "When the next attempt runs while the message is `QUEUED` or `RETRYING`." + "description": "Null when the event has no IP address." }, - "delivered_at": { - "type": "string", - "format": "date-time", + "device": { + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimelineDevice" + } + ], "nullable": true, - "description": "When the other side took the message." + "description": "Null when the event has no device fingerprint or context." + }, + "is_first_login": { + "type": "boolean", + "description": "The account's first successful sign-in on record." + }, + "is_new_device": { + "type": "boolean", + "description": "A successful sign-in from a device none of the account's earlier successful sign-ins came from. Never true on the first sign-in." } } }, - "TravelRuleDiscoveryStep": { + "NetworkTimelineIP": { "type": "object", - "description": "One step of the counterparty discovery Didit ran for an outbound transfer, in the order it ran them. The first step that names a VASP with a route ends the chain.", "properties": { - "step": { - "type": "string", - "enum": [ - "internal_address_book", - "wallet_attribution", - "network_lookup", - "customer_hint", - "end_user" - ], - "description": "`internal_address_book`: another Didit customer that proved control of the destination wallet. `wallet_attribution`: the wallet's blockchain analytics attribution. `network_lookup`: a network that can say which VASP holds the address. `customer_hint`: the VASP name, LEI or jurisdiction you sent in `beneficiary_data`. `end_user`: the counterparty the end user (or you) picked, or the request to pick one." + "address": { + "type": "string" }, - "outcome": { + "country_code": { "type": "string", - "enum": [ - "match", - "miss", - "skipped" - ], - "description": "`match`: the step named a counterparty. `miss`: it ran and found none. `skipped`: it could not run, and `reason` says why." + "nullable": true }, - "reason": { + "city": { "type": "string", - "description": "Machine-readable reason, `\"\"` on a match: `no_proven_internal_wallet`, `attribution_disabled`, `already_attributed`, `no_attributed_entity`, `directory_match_no_route`, `gtr_address_lookup_runs_on_dispatch`, `no_membership`, `network_switched_off`, `no_network_address_lookup`, `no_directory_match`, `awaiting_end_user` or `picked_member_without_proven_wallet`." + "nullable": true }, - "vasp": { + "connection_type": { "type": "string", - "format": "uuid", "nullable": true, - "description": "The directory VASP the step named, when it named one." + "description": "The connection type label for the address, as free text." }, - "rail": { - "type": "string", - "nullable": true, - "description": "The rail that reaches that counterparty, when the step found one." + "is_vpn_or_tor": { + "type": "boolean" }, - "at": { - "type": "string", - "format": "date-time" + "is_data_center": { + "type": "boolean" } } }, - "TravelRuleNextAction": { + "NetworkTimelineDevice": { "type": "object", - "description": "One thing that moves a `COUNTERPARTY_VASP_NOT_FOUND` or `COUNTERPARTY_VASP_NOT_REACHABLE` transfer on. See [Why a transfer is stuck](/transaction-monitoring/travel-rule#why-a-transfer-is-stuck).", "properties": { - "action": { + "fingerprint": { "type": "string", - "enum": [ - "select_counterparty_vasp", - "declare_self_hosted", - "add_vasp_hint", - "update_compliance_email", - "resend" - ], - "description": "`select_counterparty_vasp`: the end user picks the destination VASP in the wallet-ownership widget, or you PATCH `action=beneficiary_vasp`. `declare_self_hosted`: the end user declares the wallet self-hosted in the widget. `add_vasp_hint`: tell Didit who the counterparty is, with a VASP name, LEI or travel address (for example a `travel_address` on the destination wallet's address-book entry), then resend. `update_compliance_email` and `resend` are `action` values of `PATCH /v3/transactions/{transaction_id}/travel-rule/`: give the counterparty's compliance email again, and re-run routing." + "nullable": true }, - "url": { + "label": { "type": "string", - "format": "uri", - "description": "The wallet-ownership widget link, on `select_counterparty_vasp` and `declare_self_hosted` while the transfer has an open widget session." + "nullable": true, + "description": "A readable device label built from the event's device context." } - }, - "required": [ - "action" - ] + } }, - "TransactionTravelRule": { + "NetworkTimelineRuleHit": { "type": "object", - "description": "A transaction's Travel Rule transfer, as `GET /v3/transactions/{transaction_id}/`, the `201` of `POST /v3/transactions/` and each row of `GET /v3/transactions/` return it. `direction`, `rail`, `counterparty_vasp`, `delivery`, `discovery`, `reason` and `next_actions` have the same shape as on `PATCH /v3/transactions/{transaction_id}/travel-rule/`, so one read of a transaction says why its transfer is stuck and what moves it on.", + "description": "A live rule that matched a member's transaction or event. Test-mode matches are not included.", "properties": { - "uuid": { + "rule_id": { "type": "string", "format": "uuid" }, - "status": { + "rule_title": { "type": "string" }, - "protocol": { + "rule_category": { + "type": "string" + }, + "rule_source": { + "type": "string" + }, + "severity": { "type": "string", "nullable": true }, - "required": { - "type": "boolean" - }, - "obligations_count": { + "score_delta": { "type": "integer" }, - "originator_data": { - "type": "object", - "description": "Originator party. For an inbound transfer the counterparty's values are masked until ownership is confirmed." + "status_target": { + "type": "string", + "nullable": true }, - "beneficiary_data": { - "type": "object", - "description": "Beneficiary party. For an inbound transfer the counterparty's values are masked until ownership is confirmed." + "action_summary": { + "type": "string", + "nullable": true + } + } + }, + "NetworkTimelineCaseLinked": { + "type": "object", + "description": "A case opened for the network in your organization. `source_ref.ownership` says whether it belongs to the application you called.", + "properties": { + "case_id": { + "type": "string", + "format": "uuid" }, - "name_match": { - "type": "object", - "nullable": true, - "description": "The name comparison that decided the transfer (score and strictness). Null until one ran. The compared names are masked together with the parties." + "case_number": { + "type": "string", + "nullable": true }, - "data_match": { - "$ref": "#/components/schemas/TravelRuleDataMatch" + "status": { + "type": "string" }, - "mismatched_fields": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Shortcut for `data_match.mismatched_fields`. Empty when nothing differs." + "author_email": { + "type": "string", + "nullable": true }, - "data_unmasked": { - "$ref": "#/components/schemas/TravelRuleDataUnmasked" + "author_name": { + "type": "string", + "nullable": true + } + } + }, + "NetworkTimelineNoteAdded": { + "type": "object", + "description": "A note left on the network. The note text is not included.", + "properties": { + "note_id": { + "type": "string", + "format": "uuid" }, - "data_masked": { - "type": "boolean", - "description": "True while the counterparty's personal data is masked in this response." + "author_email": { + "type": "string" + } + } + }, + "FeatureStatusOverride": { + "type": "object", + "description": "One override of a check (feature) status made with `PATCH /v3/session/{sessionId}/features/{nodeId}/update-status/`: what it changes, whether it applied or still waits for the person to finish the flow, who asked and why.", + "required": [ + "id", + "node_id", + "feature_type", + "feature_model", + "previous_status", + "new_status", + "state", + "forced", + "reason", + "requested_by", + "requested_at", + "applied_at", + "cancelled_at", + "cancel_reason" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Identifier of the override. Pass it to the cancel endpoint.", + "example": "7c9e6679-7425-40de-944b-e07fc1f90ae7" }, - "metadata": { - "type": "object" + "node_id": { + "type": "string", + "description": "The workflow node the request named (`default` for a step without a node).", + "example": "feature_ocr_1" }, - "direction": { + "feature_type": { + "type": "string", + "description": "The `feature_type` the request passed, or an empty string when it passed none.", + "example": "" + }, + "feature_model": { + "type": "string", + "description": "The kind of check that was overridden, for example `KYC`, `Face`, `AML` or `GeolocationCheck`.", + "example": "KYC" + }, + "previous_status": { "type": "string", "enum": [ - "INBOUND", - "OUTBOUND" + "Not Finished", + "Approved", + "Declined", + "In Review", + "Resub Requested" ], - "description": "Which side of the exchange this transfer is." + "description": "The check's status when the override was requested.", + "example": "In Review" }, - "rail": { + "new_status": { "type": "string", - "nullable": true, - "description": "The rail the transfer went over: `INTERNAL`, `TRP`, `GTR`, `TRUST`, `VERIFYVASP`, `SYGNA` or `EMAIL` (`TEST_VASP` on a sandbox application, when the Didit Test VASP answered), or `null` until a rail is chosen." - }, - "counterparty_vasp": { - "type": "object", - "nullable": true, - "properties": { - "name": { - "type": "string" - }, - "lei": { - "type": "string" - }, - "dd_score": { - "type": "integer", - "description": "Due-diligence score from 0 to 100, where higher is better. Same scale as in the VASP directory." - }, - "dd_score_breakdown": { - "type": "object", - "description": "Per-component contributions to dd_score, one object per component as in the VASP directory (jurisdiction, verification, protocol, lei, history, essentials, responsiveness), each {points, max, reason, detail}. {} until the counterparty has been assessed.", - "additionalProperties": { - "type": "object", - "properties": { - "points": { - "type": "number", - "description": "Points awarded for this component." - }, - "max": { - "type": "integer", - "description": "Maximum points this component can award." - }, - "reason": { - "type": "string", - "description": "Machine-readable code of the component's verdict." - }, - "detail": { - "type": "string", - "description": "Human-readable reason for the awarded points." - } - } - } - }, - "dd_assessed_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "description": "When the due-diligence assessment last ran. Null until the counterparty has been assessed." - } - }, - "description": "The counterparty's directory entry, or `null` when the transfer links none." + "enum": [ + "Approved", + "Declined", + "In Review" + ], + "description": "The status the override sets.", + "example": "Approved" }, - "delivery": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/TravelRuleDelivery" - } + "state": { + "type": "string", + "enum": [ + "applied", + "pending_until_flow_finishes", + "cancelled" ], - "description": "The newest message the transfer owes another party. `null` when it has owed none, for example below `threshold_amount` or for a declared self-hosted wallet." + "description": "`applied`: the check has the new status. `pending_until_flow_finishes`: the override waits and applies when the person finishes the flow. `cancelled`: it waited and never applied (see `cancel_reason`).", + "example": "applied" }, - "discovery": { - "type": "array", - "description": "How Didit looked for the counterparty, one entry per step that ran. Empty when no discovery ran, for example on an inbound transfer.", - "items": { - "$ref": "#/components/schemas/TravelRuleDiscoveryStep" - } + "forced": { + "type": "boolean", + "description": "`true` when the override applied at once while the person was still in the flow.", + "example": false }, "reason": { "type": "string", - "description": "Why a `COUNTERPARTY_VASP_NOT_FOUND` or `COUNTERPARTY_VASP_NOT_REACHABLE` transfer is stuck; `\"\"` for any other status. A failed delivery decides it first, on `COUNTERPARTY_VASP_NOT_REACHABLE` only: `email_undeliverable` (the mail provider refused the compliance email and no address is left to try: when it was sent, on a reminder, or as a permanent bounce reported later) or `delivery_failed` (the rail that was delivering failed for good: a network rail refused the message or ran out of retries, a `TRP` identity host did not answer, or the counterparty's `TRP` host did not accept the inquiry). Otherwise the `discovery` trace decides it: `awaiting_end_user` (no step named a counterparty Didit can reach), `directory_match_no_route` (a step named a directory VASP that has no route), `picked_member_without_proven_wallet` (the end user picked a Didit customer that has not proven control of the wallet), or `no_directory_match` when the trace gives no other reason. A resend moves the transfer on, so the reason clears. See [Why a transfer is stuck](/transaction-monitoring/travel-rule#why-a-transfer-is-stuck)." - }, - "next_actions": { - "type": "array", - "description": "What moves the transfer on; `[]` for any status but `COUNTERPARTY_VASP_NOT_FOUND` or `COUNTERPARTY_VASP_NOT_REACHABLE`. `email_undeliverable` offers `update_compliance_email`, then `resend`. `delivery_failed` offers `resend`. A discovery reason offers `select_counterparty_vasp`, `declare_self_hosted`, `add_vasp_hint` and `resend`.", - "items": { - "$ref": "#/components/schemas/TravelRuleNextAction" - } - }, - "chain_details": { - "$ref": "#/components/schemas/TravelRuleChainDetails" - } - } - }, - "NetworkListCounts": { - "type": "object", - "description": "Network counts for the list's views and filter options, each network counted once. Returned only when `summary` is not `false`. `scopes` count every network visible to the application. `views` count the visible networks inside the selected `scope`. `facets` count the networks in the selected `scope` and `status` view (dismissed networks are left out unless `status` includes them). The other list filters do not change these counts.", - "properties": { - "scopes": { - "type": "object", - "description": "Visible networks by product.", - "properties": { - "all": { - "type": "integer" - }, - "identity": { - "type": "integer", - "description": "Every other network." - }, - "transactions": { - "type": "integer", - "description": "Networks whose members are all transaction parties." - } - } - }, - "views": { - "type": "object", - "description": "Visible networks inside the selected `scope`, by status, plus two saved views.", - "properties": { - "all": { - "type": "integer" - }, - "active": { - "type": "integer" - }, - "in_review": { - "type": "integer" - }, - "resolved": { - "type": "integer" - }, - "dismissed": { - "type": "integer" - }, - "mine": { - "type": "integer", - "description": "Networks assigned to the calling console member. Always 0 for an API key." - }, - "high_risk": { - "type": "integer", - "description": "Networks with a risk score of 80 or more that are not dismissed." - } - } + "nullable": true, + "description": "The `comment` sent with the request, or `null`.", + "example": "Document manually verified by compliance." }, - "facets": { + "requested_by": { "type": "object", - "description": "Counts for each filter option, inside the selected `scope` and status view.", + "nullable": true, + "description": "Who requested the override, or `null` when that is not known.", "properties": { - "total": { - "type": "integer", - "description": "Networks in the selected `scope` and status view." - }, - "last_activity_days": { - "type": "object", - "description": "Networks with activity in the last 7, 30 and 90 days, keyed by the number of days.", - "properties": { - "7": { - "type": "integer" - }, - "30": { - "type": "integer" - }, - "90": { - "type": "integer" - } - } - }, - "risk_min": { - "type": "object", - "description": "Networks with a risk score of at least 50 and at least 80, keyed by the threshold.", - "properties": { - "50": { - "type": "integer" - }, - "80": { - "type": "integer" - } - } - }, - "signal_types": { - "type": "object", - "description": "Networks with at least one signal of each type.", - "properties": { - "ip_address": { - "type": "integer" - }, - "device": { - "type": "integer" - }, - "face": { - "type": "integer" - }, - "document_number": { - "type": "integer" - }, - "phone": { - "type": "integer" - }, - "email": { - "type": "integer" - }, - "address": { - "type": "integer" - } - } - }, - "priority": { - "type": "object", - "description": "Networks by priority. `none` counts networks without a priority.", - "properties": { - "low": { - "type": "integer" - }, - "medium": { - "type": "integer" - }, - "high": { - "type": "integer" - }, - "none": { - "type": "integer" - } - } - }, - "assignee": { - "type": "object", - "description": "Networks by assignee.", - "properties": { - "me": { - "type": "integer", - "description": "Assigned to the calling console member. Always 0 for an API key." - }, - "unassigned": { - "type": "integer", - "description": "Assigned to nobody." - }, - "users": { - "type": "array", - "description": "One entry per assignee, most networks first.", - "items": { - "type": "object", - "properties": { - "uuid": { - "type": "string", - "format": "uuid" - }, - "full_name": { - "type": "string", - "description": "The assignee's name, or their email when no name is set." - }, - "email": { - "type": "string" - }, - "count": { - "type": "integer" - } - } - } - } - } + "email": { + "type": "string", + "format": "email", + "nullable": true, + "description": "Email of the console user, or `null` for API keys and the system.", + "example": "reviewer@example.com" }, - "has_case": { - "type": "integer", - "description": "Networks this application opened a case for." + "name": { + "type": "string", + "nullable": true, + "description": "Display name of the requester, or `null`.", + "example": "Alex Reviewer" }, - "min_size": { - "type": "object", - "description": "Networks with at least 10 members, keyed by the minimum size.", - "properties": { - "10": { - "type": "integer" - } - } + "type": { + "type": "string", + "enum": [ + "CONSOLE_USER", + "API_KEY", + "SYSTEM" + ], + "description": "Who made the request: a console user, an API key, or Didit itself.", + "example": "CONSOLE_USER" } } + }, + "requested_at": { + "type": "string", + "format": "date-time", + "description": "When the override was requested.", + "example": "2026-10-13T09:15:00Z" + }, + "applied_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the check took the new status, or `null` while it waits or once it is cancelled.", + "example": "2026-10-13T09:15:00Z" + }, + "cancelled_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When a waiting override was cancelled, or `null`.", + "example": null + }, + "cancel_reason": { + "type": "string", + "nullable": true, + "enum": [ + "cancelled_by_reviewer", + "replaced", + "check_changed", + "session_closed", + null + ], + "description": "Why a waiting override never applied, or `null`. `cancelled_by_reviewer`: cancelled with the cancel endpoint. `replaced`: a newer override on the same check replaced it. `check_changed`: the person redid the check before finishing the flow. `session_closed`: the session left the flow before the person finished it (abandoned, expired, or decided mid-flow).", + "example": null } } }, - "NetworkTag": { + "SandboxSimulateRequest": { "type": "object", - "description": "One of your application's tags on the network.", + "description": "Force a sandbox session's status. Every field is optional, but at least one of `new_status`, `scenario` or `risk` is required.", "properties": { - "uuid": { + "new_status": { "type": "string", - "format": "uuid", - "description": "The tag's UUID, the same value you pass as `tag_uuid`." + "enum": [ + "Approved", + "Declined", + "In Review", + "Expired", + "Abandoned" + ], + "description": "The status to set. When you leave it out, it defaults to the default status of the risk case (`risk`, or the first risk the scenario's magic values carry), else to the scenario's default status.", + "example": "Declined" }, - "name": { - "type": "string" + "comment": { + "type": "string", + "maxLength": 500, + "description": "Note added to the activity entry the status change records.", + "example": "Testing the decline path" }, - "color": { + "scenario": { "type": "string", - "description": "Hex color, for example `#6366F1`." + "maxLength": 100, + "description": "A scenario slug from the catalog (`GET /v1/sandbox/scenarios/`). It supplies the default status and, without `risk`, the warning its magic values carry. An unknown slug returns `400`.", + "example": "decline_aml_hit" }, - "source": { + "risk": { + "type": "string", + "maxLength": 128, + "description": "A risk case from the catalog. Its warning is added to the session, with a log type that follows `new_status`. An unknown value returns `400`.", + "example": "POSSIBLE_MATCH_FOUND" + }, + "node_id": { + "type": "string", + "maxLength": 128, + "description": "Workflow node the risk warning is attached to. Defaults to the session's current node.", + "example": "feature_aml_1" + }, + "send_webhooks": { + "type": "boolean", + "default": true, + "description": "`true` sends exactly the webhooks a real status change sends to the sandbox application's destinations: `status.updated`, plus the `user.status.updated` / `user.data.updated` (or `business.status.updated` / `business.data.updated`) events the change causes, for destinations subscribed to them. `false` changes the status without logging or sending any webhook: the missed-webhook recovery never re-sends that decision, the console still updates live, and the next status change of the session sends webhooks as usual.", + "example": true + } + } + }, + "SandboxSimulateResponse": { + "type": "object", + "required": [ + "session_id", + "previous_status", + "status", + "scenario", + "risk", + "send_webhooks" + ], + "properties": { + "session_id": { + "type": "string", + "format": "uuid", + "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6" + }, + "previous_status": { "type": "string", "enum": [ - "didit", - "custom" + "Not Started", + "In Progress", + "Approved", + "Declined", + "In Review", + "Expired", + "Abandoned", + "Kyc Expired", + "Resubmitted", + "Awaiting User" ], - "description": "`didit` for a Didit preset tag, `custom` for a tag your team created." + "description": "The session's status before the simulation.", + "example": "In Progress" }, - "added_by": { + "status": { + "type": "string", + "enum": [ + "Approved", + "Declined", + "In Review", + "Expired", + "Abandoned" + ], + "description": "The status the simulation set.", + "example": "Declined" + }, + "scenario": { "type": "string", "nullable": true, - "description": "Email of the console member who added the tag. Null when an API key added it." + "description": "The scenario slug you passed, or `null`.", + "example": "decline_aml_hit" }, - "added_at": { + "risk": { "type": "string", - "format": "date-time" + "nullable": true, + "description": "The risk case applied (`risk`, or the one taken from the scenario), or `null` when none.", + "example": "POSSIBLE_MATCH_FOUND" + }, + "send_webhooks": { + "type": "boolean", + "description": "The `send_webhooks` value the simulation applied.", + "example": false } } }, - "NetworkOutcomes": { + "CaseTeamSummary": { "type": "object", - "description": "Where the network's people and businesses stand. Each member you may see counts once, by the status of their most recent verification that reached a decision. Transaction parties are not counted.", + "nullable": true, + "description": "The review team that owns the case, or null when no team owns it. Routing sets it when a routing rule places the case with one of its teams. Change or clear it with `PATCH .../cases/{case_uuid}/` (`team`).", "properties": { - "approved": { - "type": "integer", - "description": "Members whose most recent decided verification was approved." + "uuid": { + "type": "string", + "format": "uuid" }, - "declined": { - "type": "integer", - "description": "Members whose most recent decided verification was declined." + "name": { + "type": "string" + } + } + }, + "CaseChecker": { + "type": "object", + "nullable": true, + "description": "The member named to approve or reject the pending resolution. Set only while a four-eyes resolution waits on a named checker. Null when nothing is pending, while the pending resolution waits on the checker queue, and once the resolution is approved, rejected, or returned for a new review because the evidence changed.", + "properties": { + "member_uuid": { + "type": "string", + "format": "uuid", + "description": "The member's user uuid: the value you pass as `checker` when you resolve the case." }, - "in_review": { - "type": "integer", - "description": "Members whose most recent decided verification is in review." + "name": { + "type": "string", + "nullable": true, + "description": "The member's full name, or null when it is not known." }, - "total": { - "type": "integer", - "description": "Members with at least one verification, decided or not. A member whose verifications are all undecided (not started, in progress, expired or abandoned) counts here and in no other key." + "email": { + "type": "string", + "format": "email" } } }, - "NetworkPatternScore": { + "ServiceStatusFeed": { "type": "object", - "description": "How alike one kind of the members' data is across the whole network. A pattern is not a signal: no shared value links the members.", + "description": "Public service status: the state of each Didit service, the overall state, and the incidents that are ongoing or were resolved in the last 7 days.", + "required": [ + "status", + "updated_at", + "services", + "incidents" + ], "properties": { - "type": { + "status": { "type": "string", "enum": [ - "background" + "operational", + "degraded", + "down" ], - "description": "`background`: the mean similarity of every pair of member selfie backgrounds, with the person masked out. It reads the newest selfie of each person, at most the 50 newest, and leaves out age assurance sessions. It covers the whole network, not only the members of your applications." + "description": "The worst state of any service right now, decided by the ongoing incidents only.", + "example": "degraded" }, - "score": { - "type": "number", - "nullable": true, - "minimum": 0, - "maximum": 1, - "description": "From 0 to 1, rounded to 4 decimals. Null when `reason` is set." + "updated_at": { + "type": "string", + "format": "date-time", + "description": "When Didit built this response (ISO 8601, UTC). Responses are cached for 30 seconds, so it can be up to 30 seconds old.", + "example": "2026-10-13T09:41:07.512345Z" }, - "members": { - "type": "integer", - "nullable": true, - "description": "How many members' selfies the score compared. A selfie that cannot be read, or shows too little background, is not compared. Null while `computing`; 0 or 1 with `not_enough_selfies`." + "services": { + "type": "array", + "description": "One entry per service, every service always listed.", + "items": { + "$ref": "#/components/schemas/ServiceStatusService" + } }, - "reason": { + "incidents": { + "type": "array", + "description": "Newest `started_at` first. Every ongoing incident, plus the incidents resolved in the last 7 days (at most 50 resolved incidents). Empty when nothing happened in that time.", + "items": { + "$ref": "#/components/schemas/ServiceStatusIncident" + } + } + } + }, + "ServiceStatusService": { + "type": "object", + "required": [ + "key", + "name", + "status" + ], + "properties": { + "key": { "type": "string", "enum": [ - "computing", - "not_enough_selfies" + "service_id_verification", + "service_liveness_face_match", + "service_aml_screening", + "service_kyb_registries", + "service_database_validation", + "service_phone_delivery", + "service_email_delivery", + "service_transaction_monitoring" ], - "nullable": true, - "description": "Why there is no score. `computing`: the score for the current members is being computed; read the network again later. `not_enough_selfies`: fewer than two members have a usable selfie. Null when there is a score." + "description": "Stable service key. Match on this, never on the display name. `service_id_verification`: ID verification, `service_liveness_face_match`: Liveness and face match, `service_aml_screening`: AML screening, `service_kyb_registries`: KYB registries, `service_database_validation`: Database validation, `service_phone_delivery`: Phone verification delivery, `service_email_delivery`: Email verification delivery, `service_transaction_monitoring`: Transaction monitoring.", + "example": "service_database_validation" }, - "computed_at": { + "name": { + "type": "string", + "description": "English display name of the service.", + "example": "Database validation" + }, + "status": { + "type": "string", + "enum": [ + "operational", + "degraded", + "down" + ], + "description": "`operational` when no incident is ongoing for the service, otherwise the worst state of its ongoing incidents.", + "example": "degraded" + } + } + }, + "ServiceStatusIncident": { + "type": "object", + "required": [ + "id", + "service", + "service_name", + "state", + "status", + "title", + "body", + "affected", + "country_name", + "started_at", + "resolved_at", + "duration_minutes" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "Incident ID.", + "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6" + }, + "service": { + "type": "string", + "enum": [ + "service_id_verification", + "service_liveness_face_match", + "service_aml_screening", + "service_kyb_registries", + "service_database_validation", + "service_phone_delivery", + "service_email_delivery", + "service_transaction_monitoring" + ], + "description": "Key of the affected service (see `services[].key`).", + "example": "service_database_validation" + }, + "service_name": { + "type": "string", + "description": "English display name of the affected service.", + "example": "Database validation" + }, + "state": { + "type": "string", + "enum": [ + "degraded", + "down" + ], + "description": "How the service is affected. A resolved incident keeps the last state it had.", + "example": "degraded" + }, + "status": { + "type": "string", + "enum": [ + "ongoing", + "resolved" + ], + "description": "`ongoing` until the service recovers, then `resolved`.", + "example": "ongoing" + }, + "title": { + "type": "string", + "description": "English headline. To translate it, build your own text from `service`, `state` and `country_name`.", + "example": "Database validation is degraded in Brazil." + }, + "body": { + "type": "string", + "description": "English detail line: since when checks may be slow or fail, or when it recovered.", + "example": "Checks against Brazil (CPF) may be slow or fail since 08:55 UTC." + }, + "affected": { + "type": "string", + "description": "Countries or registries affected, for example `Brazil (CPF)`. Empty when the incident is not tied to a country or registry.", + "example": "Brazil (CPF)" + }, + "country_name": { + "type": "string", + "description": "Country affected, in English. Empty when the incident is not tied to a country.", + "example": "Brazil" + }, + "started_at": { + "type": "string", + "format": "date-time", + "description": "When the incident started (ISO 8601, UTC).", + "example": "2026-10-13T08:55:00Z" + }, + "resolved_at": { "type": "string", "format": "date-time", "nullable": true, - "description": "When the score was computed. Null while `computing`." + "description": "When the service recovered (ISO 8601, UTC). `null` while the incident is ongoing." + }, + "duration_minutes": { + "type": "integer", + "nullable": true, + "description": "Whole minutes from `started_at` to `resolved_at`. `null` while the incident is ongoing." } } }, - "NetworkDetailResponse": { - "description": "The network detail, plus the organization's sharing mode, whether cross-organization signals apply to it, your application's tags on the network, member outcomes and pattern scores.", - "allOf": [ - { - "$ref": "#/components/schemas/NetworkDetail" + "TravelRuleJoinInvitation": { + "type": "object", + "description": "What the join page shows before anything is typed.", + "properties": { + "email": { + "type": "string", + "format": "email", + "description": "The address the invitation went to." }, - { + "vasp_name": { + "type": "string" + }, + "source": { + "type": "string", + "description": "Where the invitation came from, for example `pickup`." + }, + "expires_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "prefill": { "type": "object", "properties": { - "sharing_mode": { + "vasp_id": { "type": "string", - "enum": [ - "off", - "private", - "global" - ], - "description": "The organization's cross-organization sharing mode. Only `global` compares networks across organizations; `private` and `off` keep them to the organization's own history.", - "example": "global" - }, - "cross_org_available": { - "type": "boolean", - "description": "Whether cross-organization signals apply to this organization. They need both the Enterprise plan and the `global` sharing mode.", - "example": true + "format": "uuid", + "nullable": true }, - "cross_org_unavailable_reason": { - "type": "string", - "enum": [ - "plan", - "sharing_mode" - ], - "nullable": true, - "description": "Why cross-organization signals do not apply, checked in this order. `plan`: the organization's plan does not include the cross-organization fraud network (it needs the Enterprise plan), whatever the sharing mode. `sharing_mode`: the plan includes it, but the sharing mode is `private` or `off`. Null when `cross_org_available` is `true`.", - "example": null + "legal_name": { + "type": "string" }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NetworkTag" - }, - "description": "Your application's tags on the network, oldest first. Each application sees only its own tags. `fraud_tags` is separate and unchanged: the tags the network's members carry." + "lei": { + "type": "string" }, - "outcomes": { - "$ref": "#/components/schemas/NetworkOutcomes" + "jurisdiction": { + "type": "string" }, - "patterns": { + "domains": { "type": "array", "items": { - "$ref": "#/components/schemas/NetworkPatternScore" - }, - "description": "Pattern scores over the whole network. Today one item, `background`." + "type": "string" + } + } + } + } + } + }, + "TravelRuleJoinRegisterRequest": { + "type": "object", + "required": [ + "email", + "password" + ], + "properties": { + "email": { + "type": "string", + "format": "email", + "maxLength": 254, + "description": "Must be the address the invitation went to." + }, + "password": { + "type": "string", + "minLength": 8, + "maxLength": 128 + } + } + }, + "TravelRuleJoinVerifyRequest": { + "type": "object", + "required": [ + "email", + "code" + ], + "properties": { + "email": { + "type": "string", + "format": "email", + "maxLength": 254 + }, + "code": { + "type": "string", + "minLength": 6, + "maxLength": 6, + "description": "The 6-character code emailed after registering." + } + } + }, + "TravelRuleJoinCredentials": { + "type": "object", + "description": "The new free organization and the credentials its application calls the API with.", + "properties": { + "organization": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" + } + } + }, + "application": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "format": "uuid" } } + }, + "client_id": { + "type": "string" + }, + "api_key": { + "type": "string", + "description": "Send as the `x-api-key` header on the workspace endpoints." } - ] + } }, - "NetworkTagRequest": { + "TravelRuleWorkspaceClaimRequest": { "type": "object", "required": [ - "tag_uuid" + "vasp_id" ], "properties": { - "tag_uuid": { + "vasp_id": { "type": "string", "format": "uuid", - "description": "UUID of one of your application's tags." + "description": "The directory entry this workspace is. Read ids from `GET /v3/travel-rule/vasps/`." } - }, - "example": { - "tag_uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7" } }, - "NetworkTimeline": { - "title": "Default timeline (no contract)", + "TravelRuleWorkspaceDomainConfirmRequest": { "type": "object", - "description": "Without `contract`: the network's own events, oldest first, not paginated.", + "required": [ + "code" + ], "properties": { - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NetworkTimelineEvent" - } + "code": { + "type": "string", + "minLength": 6, + "maxLength": 6 } } }, - "NetworkTimelinePage": { - "title": "Typed timeline page (contract=2)", + "TravelRuleWorkspaceBillingRequest": { "type": "object", - "description": "With `contract=2`: one page of typed events, newest first.", "properties": { - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NetworkTypedTimelineEvent" - } - }, - "next_cursor": { - "type": "string", - "nullable": true, - "description": "Pass as `cursor` to read the next page. Null on the last page." + "enabled": { + "type": "boolean", + "default": true, + "description": "Only `true` is accepted: outbound billing cannot be turned back off through the API." } } }, - "NetworkTypedTimelineEvent": { + "TravelRuleWorkspaceDomainCodeResponse": { "type": "object", - "description": "One typed timeline event: the four default fields, plus its id, when Didit stored it, the member account and record it belongs to, and the detail block of its event type. The other detail blocks are null.", "properties": { - "id": { - "type": "string", - "description": "`:`, unique within the timeline.", - "example": "session:3fa85f64-5717-4562-b3fc-2c963f66afa6" + "domain": { + "type": "string" }, - "event_type": { + "status": { "type": "string", "enum": [ - "network_detected", - "signal_observed", - "network_active", - "network_in_review", - "network_resolved", - "network_dismissed", - "verification_attempt", - "transaction", - "login", - "rule_hit", - "case_linked", - "note_added" + "unverified", + "code_sent", + "verified" ] }, - "occurred_at": { + "txt": { + "$ref": "#/components/schemas/TravelRuleWorkspaceTxtRecord" + } + } + }, + "TravelRuleWorkspaceTxtRecord": { + "type": "object", + "description": "The TXT record to publish for the DNS proof. Empty until a proof has been started.", + "properties": { + "host": { "type": "string", - "format": "date-time", - "description": "When it happened." + "example": "didit-tr-verify.example.com" }, - "ingested_at": { + "value": { + "type": "string" + } + } + }, + "TravelRuleWorkspace": { + "type": "object", + "description": "The free Travel Rule workspace of an application that joined free.", + "properties": { + "joined_free": { + "type": "boolean" + }, + "work_email": { "type": "string", - "format": "date-time", - "description": "When Didit stored it." + "format": "email" }, - "label": { + "joined_at": { "type": "string", - "description": "A short English label, for example `Verification attempt 2 of 3`." + "format": "date-time", + "nullable": true }, - "metadata": { + "claim": { "type": "object", - "description": "For the network's own events, the same metadata as the default timeline. Empty otherwise." - }, - "account": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineAccount" - } - ], - "nullable": true, - "description": "The member account. Null for the network's own events, `case_linked` and `note_added`." - }, - "source_ref": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineSourceRef" + "properties": { + "status": { + "type": "string", + "enum": [ + "unclaimed", + "pending_review", + "claimed", + "rejected" + ] + }, + "proved_by_domain": { + "type": "boolean" + }, + "claimed_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "reviewed_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "review_note": { + "type": "string" + }, + "vasp_id": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "vasp_name": { + "type": "string" } - ], - "nullable": true, - "description": "The source record. Null for the network's own events and `note_added`." + } }, - "verification_attempt": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineAttempt" - } - ], - "nullable": true, - "description": "Set on `verification_attempt` events." + "prefill": { + "type": "object", + "description": "Profile values taken from the directory entry: `vasp_id`, `legal_name`, `lei`, `jurisdiction`, `compliance_email`, `domains`. Nothing is written until the claim is made." }, - "transaction": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineTransaction" + "domain": { + "type": "object", + "properties": { + "domain": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "unverified", + "code_sent", + "verified" + ] + }, + "verified_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "txt": { + "$ref": "#/components/schemas/TravelRuleWorkspaceTxtRecord" } - ], - "nullable": true, - "description": "Set on `transaction` events." + } }, - "login": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineLogin" - } - ], - "nullable": true, - "description": "Set on `login` events." + "billing_enabled": { + "type": "boolean", + "description": "Receiving Travel Rule data is free. Sending is billed only after billing is enabled." }, - "rule_hit": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineRuleHit" - } - ], - "nullable": true, - "description": "Set on `rule_hit` events." + "billing_enabled_at": { + "type": "string", + "format": "date-time", + "nullable": true }, - "case_linked": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineCaseLinked" - } - ], - "nullable": true, - "description": "Set on `case_linked` events." + "didit_network": { + "type": "object", + "description": "Whether the Didit network lists this VASP and, when not, each condition it still misses." }, - "note_added": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineNoteAdded" - } - ], - "nullable": true, - "description": "Set on `note_added` events. Never returned to an API key." + "settings": { + "$ref": "#/components/schemas/TravelRuleSettingsDetail" } } }, - "NetworkTimelineAccount": { + "InvestigatorDecision": { "type": "object", - "description": "The member account the event belongs to.", + "description": "How the item left the Investigator queue. `decided_by`, `original_outcome` and `overrides` are returned by the accept and override endpoints and the report; the `investigator` block of a session decision carries the other fields.", "properties": { - "node_id": { + "outcome": { "type": "string", - "description": "`:`, where kind is `vendor_user`, `vendor_business` or `transaction_party`.", - "example": "vendor_user:3fa85f64-5717-4562-b3fc-2c963f66afa6" + "enum": [ + "accepted", + "edited", + "overridden", + "decided_elsewhere", + "automated" + ], + "description": "`accepted` or `edited` took the recommendation (`edited` with a rewritten narrative), `overridden` took another action, `decided_elsewhere` is a decision taken outside the Investigator while the report was open, `automated` is a decision the Investigator took on its own." }, - "node_type": { + "action": { "type": "string", "enum": [ - "account", - "business_account", - "transaction_party" + "approve", + "decline", + "escalate", + "request" ] }, - "uuid": { - "type": "string", - "format": "uuid" - }, - "vendor_data": { + "actor_email": { "type": "string", "nullable": true }, - "display_name": { + "actor_name": { "type": "string", "nullable": true }, - "ownership": { - "type": "string", - "enum": [ - "owned", - "organization" - ], - "description": "`owned` when the record belongs to the application you called (for a console member, to an application they were granted). `organization` when it belongs to another application of your organization." - }, - "route": { - "$ref": "#/components/schemas/NetworkTimelineRoute" - } - } - }, - "NetworkTimelineSourceRef": { - "type": "object", - "description": "The record the event was read from.", - "properties": { - "kind": { - "type": "string", - "enum": [ - "session", - "business_session", - "transaction", - "monitoring_event", - "case" - ] - }, - "id": { - "type": "string", - "format": "uuid" - }, - "ownership": { + "override_category": { "type": "string", "enum": [ - "owned", - "organization" - ], - "description": "`owned` when the record belongs to the application you called (for a console member, to an application they were granted). `organization` when it belongs to another application of your organization." - }, - "route": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineRoute" - } + "missing_context", + "needs_information", + "policy_differs", + "evidence_misread", + "other", + "" ], - "description": "Absent for `monitoring_event` and `case`." - } - } - }, - "NetworkTimelineRoute": { - "type": "object", - "description": "Where the record opens: its kind, its UUID and the application it belongs to.", - "properties": { - "kind": { - "type": "string", - "description": "`user`, `business` or `transaction_party` for an account; `session`, `business_session` or `transaction` for a source record." + "nullable": true }, - "id": { + "override_reason": { "type": "string", - "format": "uuid" + "nullable": true }, - "application_id": { - "type": "string", - "format": "uuid" - } - } - }, - "NetworkTimelineAttempt": { - "type": "object", - "description": "One verification session of the account.", - "properties": { - "session_id": { + "final_status": { "type": "string", - "format": "uuid", - "description": "The session UUID, or the business session UUID for a company." + "description": "The item's status after the decision." }, - "session_number": { - "type": "integer", + "agreed": { + "type": "boolean", + "description": "Whether the decision matched the recommendation.", "nullable": true }, - "attempt": { - "type": "integer", - "description": "This session's position among the account's sessions, in creation order." + "decided_at": { + "type": "string", + "format": "date-time" }, - "attempt_count": { - "type": "integer", - "description": "How many sessions the account has." + "billed": { + "type": "boolean", + "description": "The review was charged." }, - "status": { + "decided_by": { "type": "string", - "description": "The session status, for example `Approved` or `Declined`." + "enum": [ + "investigator", + "member" + ] }, - "status_changed_at": { - "type": "string", - "format": "date-time", + "original_outcome": { + "type": "object", + "description": "The decision the Investigator took on its own, unchanged by later overrides. Null for a decision the team took.", + "properties": { + "action": { + "type": "string" + }, + "final_status": { + "type": "string" + }, + "decided_at": { + "type": "string", + "format": "date-time" + } + }, "nullable": true }, - "decline_reasons": { + "overrides": { "type": "array", + "description": "Every override of a decision the Investigator took on its own, oldest first.", "items": { - "$ref": "#/components/schemas/NetworkTimelineDeclineReason" - }, - "description": "For a declined session only: its warnings, oldest first, once per warning. Empty otherwise." + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "actor_email": { + "type": "string", + "nullable": true + }, + "actor_name": { + "type": "string", + "nullable": true + }, + "override_category": { + "type": "string" + }, + "override_reason": { + "type": "string" + }, + "previous_status": { + "type": "string" + }, + "final_status": { + "type": "string" + }, + "agreed": { + "type": "boolean", + "nullable": true + }, + "overridden_at": { + "type": "string", + "format": "date-time" + } + } + } } } }, - "NetworkTimelineDeclineReason": { + "InvestigatorBlock": { "type": "object", + "nullable": true, + "description": "The item's latest Investigator review, or null when it never had one. Carried by the V3 session and business session decision (and so by `status.updated` webhooks).", "properties": { - "risk": { + "run_id": { "type": "string", - "description": "The warning code." + "format": "uuid" }, - "feature": { + "status": { "type": "string", - "description": "The feature that raised the warning." + "enum": [ + "running", + "completed", + "failed" + ] }, - "short_description": { - "type": "string" - } - } - }, - "NetworkTimelineTransaction": { - "type": "object", - "description": "A transaction a member account took part in, dated by its transaction date.", - "properties": { - "transaction_id": { + "stage": { "type": "string", - "format": "uuid" - }, - "transaction_number": { - "type": "integer", - "nullable": true + "enum": [ + "shadow", + "live" + ] }, - "transaction_type": { - "type": "string" + "queue": { + "type": "string", + "enum": [ + "kyc", + "kyb", + "aml", + "transactions", + "cases" + ] }, - "action_type": { - "type": "string" + "is_open": { + "type": "boolean" }, - "amount": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineAmount" - } + "recommendation": { + "type": "string", + "enum": [ + "approve", + "decline", + "escalate", + "request" ], - "nullable": true, - "description": "Null when the transaction has no amount." - }, - "status": { - "type": "string" + "nullable": true }, - "decision_reason_code": { + "recommendation_detail": { "type": "string", "nullable": true }, - "decision_reason_label": { + "confidence": { "type": "string", + "enum": [ + "high", + "moderate", + "low" + ], "nullable": true }, - "party_role": { - "type": "string", - "description": "The account's role in the transaction: `APPLICANT`, `REMITTER`, `BENEFICIARY` or `COUNTERPARTY`." - } - } - }, - "NetworkTimelineAmount": { - "type": "object", - "properties": { - "value": { + "summary": { "type": "string", - "description": "Decimal amount as a string." + "nullable": true }, - "currency": { - "type": "string" + "ready_to_accept": { + "type": "boolean" }, - "direction": { + "prepared_at": { "type": "string", + "format": "date-time", "nullable": true - } - } - }, - "NetworkTimelineLogin": { - "type": "object", - "description": "A sign-in event you posted for a person through the events API.", - "properties": { - "action": { - "type": "string", - "description": "`.`: `auth.login` or `security.login_succeeded` for a sign-in, `auth.login_failed` or `security.login_failed` for a failed one." }, - "succeeded": { - "type": "boolean" + "automated": { + "type": "boolean", + "description": "The Investigator decided on its own, even if the decision was later overridden." }, - "status": { + "decided_by": { "type": "string", - "description": "The event's status." - }, - "ip": { - "allOf": [ - { - "$ref": "#/components/schemas/NetworkTimelineIP" - } + "enum": [ + "investigator", + "member" ], - "nullable": true, - "description": "Null when the event has no IP address." + "nullable": true }, - "device": { + "decision": { + "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/NetworkTimelineDevice" + "$ref": "#/components/schemas/InvestigatorDecision" } ], - "nullable": true, - "description": "Null when the event has no device fingerprint or context." - }, - "is_first_login": { - "type": "boolean", - "description": "The account's first successful sign-in on record." - }, - "is_new_device": { - "type": "boolean", - "description": "A successful sign-in from a device none of the account's earlier successful sign-ins came from. Never true on the first sign-in." + "type": "object" } } }, - "NetworkTimelineIP": { + "InvestigatorQueueRow": { "type": "object", "properties": { - "address": { - "type": "string" + "run_id": { + "type": "string", + "format": "uuid" }, - "country_code": { + "kind": { "type": "string", - "nullable": true + "enum": [ + "session", + "business_session", + "transaction", + "case" + ] }, - "city": { + "queue": { "type": "string", - "nullable": true + "enum": [ + "kyc", + "kyb", + "aml", + "transactions", + "cases" + ] }, - "connection_type": { + "stage": { "type": "string", - "nullable": true, - "description": "The connection type label for the address, as free text." + "enum": [ + "shadow", + "live" + ] }, - "is_vpn_or_tor": { - "type": "boolean" + "subject": { + "type": "object", + "description": "The item under review: `id`, `number`, `status`, `name` and, depending on the kind, `country`, `workflow`, `vendor_data`, `txn_id`, `amount`, `currency`, `direction`, `title` or `priority`.", + "additionalProperties": true }, - "is_data_center": { - "type": "boolean" - } - } - }, - "NetworkTimelineDevice": { - "type": "object", - "properties": { - "fingerprint": { + "recommendation": { "type": "string", - "nullable": true + "enum": [ + "approve", + "decline", + "escalate", + "request" + ] }, - "label": { - "type": "string", - "nullable": true, - "description": "A readable device label built from the event's device context." - } - } - }, - "NetworkTimelineRuleHit": { - "type": "object", - "description": "A live rule that matched a member's transaction or event. Test-mode matches are not included.", - "properties": { - "rule_id": { + "recommendation_detail": { + "type": "string" + }, + "confidence": { "type": "string", - "format": "uuid" + "enum": [ + "high", + "moderate", + "low" + ] }, - "rule_title": { + "summary": { "type": "string" }, - "rule_category": { - "type": "string" + "sources_count": { + "type": "integer" }, - "rule_source": { - "type": "string" + "ready_to_accept": { + "type": "boolean" }, - "severity": { + "guardrails": { + "description": "The locked guardrails that hold this item, if any." + }, + "waiting_since": { "type": "string", + "format": "date-time", "nullable": true }, - "score_delta": { - "type": "integer" - }, - "status_target": { + "due_at": { "type": "string", + "format": "date-time", "nullable": true }, - "action_summary": { + "prepared_at": { "type": "string", + "format": "date-time", "nullable": true } } }, - "NetworkTimelineCaseLinked": { + "InvestigatorRunDetail": { + "allOf": [ + { + "$ref": "#/components/schemas/InvestigatorQueueRow" + }, + { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "is_open": { + "type": "boolean" + }, + "lookups": { + "type": "integer", + "description": "How many sections and linked records it read." + }, + "duration_ms": { + "type": "integer", + "nullable": true + }, + "agent_version": { + "type": "string" + }, + "prepared_before_opened": { + "type": "boolean", + "nullable": true + }, + "report": { + "type": "object", + "additionalProperties": true, + "description": "The report: reasoning, evidence points with their verdict (`ok`, `risk`, `look`, `explained`, `context`) and cited sources, screening hit verdicts (`same`, `not_same`, `unclear`) and suggested next steps." + }, + "trail": { + "description": "What I checked: the overview, sections and records it read, in order." + }, + "decision": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/InvestigatorDecision" + } + ], + "type": "object" + }, + "autonomy": { + "type": "object", + "additionalProperties": true, + "description": "What autonomy made of the report (`result`, `reason`, `tier`, `policy_version`, `rule`, `agreement`, `decisions`, `threshold`, `at`). Null when the queue is not automated.", + "nullable": true + } + } + } + ] + }, + "InvestigatorAcceptRequest": { "type": "object", - "description": "A case opened for the network in your organization. `source_ref.ownership` says whether it belongs to the application you called.", "properties": { - "case_id": { - "type": "string", - "format": "uuid" - }, - "case_number": { + "narrative": { "type": "string", - "nullable": true + "maxLength": 4000, + "description": "A rewritten narrative. Sending one records the decision as edited and accepted." }, - "status": { - "type": "string" + "send_email": { + "type": "boolean", + "default": false, + "description": "Email the person about the decision." }, - "author_email": { + "email_address": { "type": "string", - "nullable": true + "format": "email", + "description": "Required when `send_email` is true." }, - "author_name": { - "type": "string", - "nullable": true - } - } - }, - "NetworkTimelineNoteAdded": { - "type": "object", - "description": "A note left on the network. The note text is not included.", - "properties": { - "note_id": { + "email_language": { "type": "string", - "format": "uuid" - }, - "author_email": { - "type": "string" + "default": "en", + "maxLength": 16 } } }, - "FeatureStatusOverride": { + "InvestigatorOverrideRequest": { "type": "object", - "description": "One override of a check (feature) status made with `PATCH /v3/session/{sessionId}/features/{nodeId}/update-status/`: what it changes, whether it applied or still waits for the person to finish the flow, who asked and why.", "required": [ - "id", - "node_id", - "feature_type", - "feature_model", - "previous_status", - "new_status", - "state", - "forced", - "reason", - "requested_by", - "requested_at", - "applied_at", - "cancelled_at", - "cancel_reason" + "action", + "category", + "reason" ], "properties": { - "id": { - "type": "string", - "format": "uuid", - "description": "Identifier of the override. Pass it to the cancel endpoint.", - "example": "7c9e6679-7425-40de-944b-e07fc1f90ae7" - }, - "node_id": { - "type": "string", - "description": "The workflow node the request named (`default` for a step without a node).", - "example": "feature_ocr_1" - }, - "feature_type": { - "type": "string", - "description": "The `feature_type` the request passed, or an empty string when it passed none.", - "example": "" - }, - "feature_model": { - "type": "string", - "description": "The kind of check that was overridden, for example `KYC`, `Face`, `AML` or `GeolocationCheck`.", - "example": "KYC" - }, - "previous_status": { - "type": "string", - "enum": [ - "Not Finished", - "Approved", - "Declined", - "In Review", - "Resub Requested" - ], - "description": "The check's status when the override was requested.", - "example": "In Review" - }, - "new_status": { + "action": { "type": "string", "enum": [ - "Approved", - "Declined", - "In Review" - ], - "description": "The status the override sets.", - "example": "Approved" + "approve", + "decline", + "escalate", + "request" + ] }, - "state": { + "category": { "type": "string", "enum": [ - "applied", - "pending_until_flow_finishes", - "cancelled" - ], - "description": "`applied`: the check has the new status. `pending_until_flow_finishes`: the override waits and applies when the person finishes the flow. `cancelled`: it waited and never applied (see `cancel_reason`).", - "example": "applied" - }, - "forced": { - "type": "boolean", - "description": "`true` when the override applied at once while the person was still in the flow.", - "example": false + "missing_context", + "needs_information", + "policy_differs", + "evidence_misread", + "other" + ] }, "reason": { "type": "string", - "nullable": true, - "description": "The `comment` sent with the request, or `null`.", - "example": "Document manually verified by compliance." + "minLength": 10, + "maxLength": 500 }, - "requested_by": { - "type": "object", - "nullable": true, - "description": "Who requested the override, or `null` when that is not known.", - "properties": { - "email": { - "type": "string", - "format": "email", - "nullable": true, - "description": "Email of the console user, or `null` for API keys and the system.", - "example": "reviewer@example.com" - }, - "name": { - "type": "string", - "nullable": true, - "description": "Display name of the requester, or `null`.", - "example": "Alex Reviewer" - }, - "type": { - "type": "string", - "enum": [ - "CONSOLE_USER", - "API_KEY", - "SYSTEM" - ], - "description": "Who made the request: a console user, an API key, or Didit itself.", - "example": "CONSOLE_USER" - } - } + "send_email": { + "type": "boolean", + "default": false, + "description": "Email the person about the decision." }, - "requested_at": { + "email_address": { "type": "string", - "format": "date-time", - "description": "When the override was requested.", - "example": "2026-10-13T09:15:00Z" + "format": "email", + "description": "Required when `send_email` is true." }, - "applied_at": { + "email_language": { "type": "string", - "format": "date-time", - "nullable": true, - "description": "When the check took the new status, or `null` while it waits or once it is cancelled.", - "example": "2026-10-13T09:15:00Z" + "default": "en", + "maxLength": 16 + } + } + }, + "InvestigatorBatchAcceptRequest": { + "type": "object", + "required": [ + "run_ids" + ], + "properties": { + "run_ids": { + "type": "array", + "minItems": 1, + "maxItems": 50, + "items": { + "type": "string", + "format": "uuid" + } + } + } + }, + "InvestigatorBatchAcceptResponse": { + "type": "object", + "properties": { + "accepted": { + "type": "integer" }, - "cancelled_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "description": "When a waiting override was cancelled, or `null`.", - "example": null + "skipped": { + "type": "integer" }, - "cancel_reason": { - "type": "string", - "nullable": true, - "enum": [ - "cancelled_by_reviewer", - "replaced", - "check_changed", - "session_closed", - null - ], - "description": "Why a waiting override never applied, or `null`. `cancelled_by_reviewer`: cancelled with the cancel endpoint. `replaced`: a newer override on the same check replaced it. `check_changed`: the person redid the check before finishing the flow. `session_closed`: the session left the flow before the person finished it (abandoned, expired, or decided mid-flow).", - "example": null + "results": { + "type": "array", + "items": { + "type": "object", + "properties": { + "run_id": { + "type": "string", + "format": "uuid" + }, + "result": { + "type": "string", + "enum": [ + "accepted", + "skipped" + ] + }, + "reason": { + "type": "string", + "enum": [ + "not_found", + "forbidden", + "already_decided", + "not_ready", + "guardrail", + "invalid" + ] + }, + "detail": {}, + "action": { + "type": "string" + }, + "final_status": { + "type": "string" + } + } + } } } }, - "SandboxSimulateRequest": { + "InvestigatorSettings": { "type": "object", - "description": "Force a sandbox session's status. Every field is optional, but at least one of `new_status`, `scenario` or `risk` is required.", "properties": { - "new_status": { + "stage": { "type": "string", "enum": [ - "Approved", - "Declined", - "In Review", - "Expired", - "Abandoned" - ], - "description": "The status to set. When you leave it out, it defaults to the default status of the risk case (`risk`, or the first risk the scenario's magic values carry), else to the scenario's default status.", - "example": "Declined" - }, - "comment": { - "type": "string", - "maxLength": 500, - "description": "Note added to the activity entry the status change records.", - "example": "Testing the decline path" + "none", + "shadow", + "live" + ] }, - "scenario": { + "stage_changed_at": { "type": "string", - "maxLength": 100, - "description": "A scenario slug from the catalog (`GET /v1/sandbox/scenarios/`). It supplies the default status and, without `risk`, the warning its magic values carry. An unknown slug returns `400`.", - "example": "decline_aml_hit" + "format": "date-time", + "readOnly": true, + "nullable": true }, - "risk": { + "stage_changed_by": { "type": "string", - "maxLength": 128, - "description": "A risk case from the catalog. Its warning is added to the session, with a log type that follows `new_status`. An unknown value returns `400`.", - "example": "POSSIBLE_MATCH_FOUND" + "readOnly": true }, - "node_id": { + "monthly_spend_limit": { "type": "string", - "maxLength": 128, - "description": "Workflow node the risk warning is attached to. Defaults to the session's current node.", - "example": "feature_aml_1" + "format": "decimal", + "description": "Monthly limit in your billing currency, 0.01 to 1,000,000. Null turns it off.", + "nullable": true }, - "send_webhooks": { - "type": "boolean", - "default": true, - "description": "`true` sends exactly the webhooks a real status change sends to the sandbox application's destinations: `status.updated`, plus the `user.status.updated` / `user.data.updated` (or `business.status.updated` / `business.data.updated`) events the change causes, for destinations subscribed to them. `false` changes the status without logging or sending any webhook: the missed-webhook recovery never re-sends that decision, the console still updates live, and the next status change of the session sends webhooks as usual.", - "example": true + "spend_limit": { + "type": "object", + "readOnly": true, + "properties": { + "enabled": { + "type": "boolean" + }, + "limit": { + "type": "string", + "format": "decimal", + "nullable": true + }, + "spent": { + "type": "string", + "format": "decimal" + }, + "reviews": { + "type": "integer" + }, + "reserved": { + "type": "string", + "format": "decimal", + "description": "The price of every open live report, held back because accepting it charges it." + }, + "currency": { + "type": "string" + }, + "paused": { + "type": "boolean", + "description": "At the limit: no new review starts." + } + } } } }, - "SandboxSimulateResponse": { + "TravelRuleUtxoEntry": { "type": "object", + "description": "One input or output of a UTXO transaction, as the chain recorded it.", "required": [ - "session_id", - "previous_status", - "status", - "scenario", - "risk", - "send_webhooks" + "address" ], "properties": { - "session_id": { - "type": "string", - "format": "uuid", - "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6" - }, - "previous_status": { - "type": "string", - "enum": [ - "Not Started", - "In Progress", - "Approved", - "Declined", - "In Review", - "Expired", - "Abandoned", - "Kyc Expired", - "Resubmitted", - "Awaiting User" - ], - "description": "The session's status before the simulation.", - "example": "In Progress" - }, - "status": { + "address": { "type": "string", - "enum": [ - "Approved", - "Declined", - "In Review", - "Expired", - "Abandoned" - ], - "description": "The status the simulation set.", - "example": "Declined" + "maxLength": 128 }, - "scenario": { + "amount": { "type": "string", "nullable": true, - "description": "The scenario slug you passed, or `null`.", - "example": "decline_aml_hit" + "description": "Decimal string in the coin's own unit (BTC, not satoshis). Optional.", + "example": "0.0125" }, - "risk": { + "txid": { "type": "string", - "nullable": true, - "description": "The risk case applied (`risk`, or the one taken from the scenario), or `null` when none.", - "example": "POSSIBLE_MATCH_FOUND" + "maxLength": 128, + "description": "Optional. The transaction an input spends." }, - "send_webhooks": { - "type": "boolean", - "description": "The `send_webhooks` value the simulation applied.", - "example": false + "vout": { + "type": "integer", + "nullable": true, + "minimum": 0, + "description": "Optional. The output index an input spends." } } }, - "CaseTeamSummary": { + "TravelRuleUtxo": { "type": "object", - "nullable": true, - "description": "The review team that owns the case, or null when no team owns it. Routing sets it when a routing rule places the case with one of its teams. Change or clear it with `PATCH .../cases/{case_uuid}/` (`team`).", + "description": "The inputs and outputs of a UTXO transfer (BTC, LTC, BCH, DOGE). Only accepted on those chains: on any other chain it is a `400`. From them Didit infers the originator wallet (the declared one, else the input address that contributed the most) and the beneficiary output (the declared one, else the only output that does not pay an input address back as change, else the one output paying the transfer amount). The result is on the transfer's `chain_details`.", + "required": [ + "outputs" + ], "properties": { - "uuid": { - "type": "string", - "format": "uuid" + "inputs": { + "type": "array", + "maxItems": 1000, + "items": { + "$ref": "#/components/schemas/TravelRuleUtxoEntry" + }, + "description": "Optional. Without inputs no originator is inferred and no change output is recognised." }, - "name": { - "type": "string" + "outputs": { + "type": "array", + "minItems": 1, + "maxItems": 1000, + "items": { + "$ref": "#/components/schemas/TravelRuleUtxoEntry" + } } } }, - "CaseChecker": { + "TravelRuleChainSide": { "type": "object", - "nullable": true, - "description": "The member named to approve or reject the pending resolution. Set only while a four-eyes resolution waits on a named checker. Null when nothing is pending, while the pending resolution waits on the checker queue, and once the resolution is approved, rejected, or returned for a new review because the evidence changed.", + "description": "One side's wallet as Didit resolved it from the chain data.", "properties": { - "member_uuid": { + "address": { "type": "string", - "format": "uuid", - "description": "The member's user uuid: the value you pass as `checker` when you resolve the case." + "description": "The wallet. On a memo network the classic address (an XRP X-address is split into its classic address and its tag); on Lightning the payee node id or Lightning Address." }, - "name": { + "memo": { "type": "string", - "nullable": true, - "description": "The member's full name, or null when it is not known." + "description": "The destination tag or memo that is part of the wallet; `\"\"` for none." }, - "email": { + "source": { "type": "string", - "format": "email" + "enum": [ + "declared", + "x_address", + "largest_input", + "only_non_change_output", + "amount_match", + "invoice_payee", + "updated" + ], + "description": "Where the wallet came from: `declared` (your request), `x_address` (split from an XRP X-address), `largest_input` (the UTXO input address that contributed the most), `only_non_change_output` (the only UTXO output that is not change), `amount_match` (the one UTXO output paying the transfer amount), `invoice_payee` (the payee a Lightning payment request names), `updated` (set later with `action: update_originator_wallet`)." } } }, - "ServiceStatusFeed": { + "TravelRuleChainDetails": { "type": "object", - "description": "Public service status: the state of each Didit service, the overall state, and the incidents that are ongoing or were resolved in the last 7 days.", - "required": [ - "status", - "updated_at", - "services", - "incidents" - ], + "description": "How the transfer's chain names its two wallets, when that is more than one address paying another. Empty (`{}`) for an account-chain transfer (EVM, Solana, Tron), where the two addresses are the wallets. Matching, routing and the address book read the wallets from here first.", "properties": { - "status": { + "chain": { "type": "string", - "enum": [ - "operational", - "degraded", - "down" - ], - "description": "The worst state of any service right now, decided by the ongoing incidents only.", - "example": "degraded" + "description": "Canonical chain, e.g. `BTC`, `XRP`, or `LIGHTNING` for a Lightning transfer." }, - "updated_at": { + "shape": { "type": "string", - "format": "date-time", - "description": "When Didit built this response (ISO 8601, UTC). Responses are cached for 30 seconds, so it can be up to 30 seconds old.", - "example": "2026-10-13T09:41:07.512345Z" + "enum": [ + "utxo", + "memo", + "lightning" + ] }, - "services": { - "type": "array", - "description": "One entry per service, every service always listed.", - "items": { - "$ref": "#/components/schemas/ServiceStatusService" + "originator": { + "$ref": "#/components/schemas/TravelRuleChainSide" + }, + "beneficiary": { + "$ref": "#/components/schemas/TravelRuleChainSide" + }, + "utxo": { + "type": "object", + "description": "On a UTXO transfer: the inputs and outputs as stored (amounts as decimal strings) and which outputs Didit read as what.", + "properties": { + "inputs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TravelRuleUtxoEntry" + } + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TravelRuleUtxoEntry" + } + }, + "change_output_indexes": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "Outputs that pay an input address back." + }, + "beneficiary_output_index": { + "type": "integer", + "nullable": true, + "description": "The output that pays the beneficiary; null when none could be told apart." + } } }, - "incidents": { + "lightning": { + "type": "object", + "description": "On a Lightning transfer: what the payment request says. Always `kind` (`bolt11`, `bolt12_offer`, `bolt12_invoice`, `bolt12_invoice_request`, `lnurl`, `lightning_address`, `node_id` or `unknown`); a BOLT11 invoice adds `network`, `payee_node_id`, `payment_hash`, `amount_msat`, `created_at` and `expires_at`; a BOLT12 string `blinded_paths` and `payee_node_id`; an LNURL or a Lightning Address its `domain`. Nothing is resolved over the network: the request is decoded only.", + "additionalProperties": true + }, + "warnings": { "type": "array", - "description": "Newest `started_at` first. Every ongoing incident, plus the incidents resolved in the last 7 days (at most 50 resolved incidents). Empty when nothing happened in that time.", "items": { - "$ref": "#/components/schemas/ServiceStatusIncident" - } + "type": "string", + "enum": [ + "declared_originator_not_an_input", + "declared_beneficiary_not_an_output", + "beneficiary_output_ambiguous", + "beneficiary_output_amount_differs" + ] + }, + "description": "UTXO inconsistencies worth a look: the declared originator is not an input, the declared beneficiary is not an output, no single beneficiary output could be told apart, or the beneficiary output pays a different amount than the transaction states." + }, + "not_applicable_reason": { + "type": "string", + "enum": [ + "LIGHTNING_NO_PAYEE_IDENTIFIER", + "LIGHTNING_BOLT12_BLINDED_PAYEE", + "LIGHTNING_LNURL_NAMES_NO_PAYEE" + ], + "description": "On an outbound Lightning transfer whose payment request names no payee: why the transfer is `NOT_APPLICABLE`. `LIGHTNING_NO_PAYEE_IDENTIFIER` (the request names no payee node, or could not be decoded), `LIGHTNING_BOLT12_BLINDED_PAYEE` (the offer hides its payee behind blinded paths), `LIGHTNING_LNURL_NAMES_NO_PAYEE` (an LNURL names a service, not a payee). The same code opens the transfer's last `timeline` entry." } } }, - "ServiceStatusService": { + "WalletAddressImportRow": { "type": "object", - "required": [ - "key", - "name", - "status" - ], + "description": "One wallet to import: by its `address`, its `address_hash`, or both. The camelCase forms of these fields are accepted too, as are `walletAddress`, `walletAddressHash`, `destinationTag` and `externalUserId`.", "properties": { - "key": { + "address": { + "type": "string", + "maxLength": 128, + "description": "The wallet address. Alias: `walletAddress`." + }, + "address_hash": { + "type": "string", + "description": "SHA-256 of the lowercased address, as 64 hex characters or 44 base64 characters. Send it alone to register a wallet without disclosing its address; sent with `address`, it must be that address's hash. Alias: `walletAddressHash`." + }, + "chain": { + "type": "string", + "maxLength": 32 + }, + "memo": { + "type": "string", + "maxLength": 256, + "description": "The destination tag or memo. XRP: a destination tag, a whole number from 0 to 4294967295 (a JSON number is accepted). XLM: a text memo of up to 28 bytes, a 64-bit id or a 32-byte hash in hex. EOS: up to 256 bytes. ATOM: up to 256 characters. HBAR: up to 100 bytes. Bitcoin, EVM, Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin and Lightning wallets take no memo: one there is a `400`." + }, + "holder_name": { + "type": "string", + "maxLength": 255 + }, + "holder_vendor_data": { + "type": "string", + "maxLength": 255, + "description": "Your internal identifier for the holder. Alias: `externalUserId`." + }, + "entity_type": { "type": "string", "enum": [ - "service_id_verification", - "service_liveness_face_match", - "service_aml_screening", - "service_kyb_registries", - "service_database_validation", - "service_phone_delivery", - "service_email_delivery", - "service_transaction_monitoring" + "individual", + "company" ], - "description": "Stable service key. Match on this, never on the display name. `service_id_verification`: ID verification, `service_liveness_face_match`: Liveness and face match, `service_aml_screening`: AML screening, `service_kyb_registries`: KYB registries, `service_database_validation`: Database validation, `service_phone_delivery`: Phone verification delivery, `service_email_delivery`: Email verification delivery, `service_transaction_monitoring`: Transaction monitoring.", - "example": "service_database_validation" + "default": "individual" }, - "name": { + "label": { "type": "string", - "description": "English display name of the service.", - "example": "Database validation" + "maxLength": 255 }, - "status": { + "owner_type": { "type": "string", "enum": [ - "operational", - "degraded", - "down" + "customer", + "internal", + "vasp" ], - "description": "`operational` when no incident is ongoing for the service, otherwise the worst state of its ongoing incidents.", - "example": "degraded" + "default": "customer" + }, + "travel_address": { + "type": "string", + "maxLength": 512 + }, + "self_declared": { + "type": "boolean", + "default": false, + "description": "Create the entry already verified through a self-declaration, when your settings allow it." } } }, - "ServiceStatusIncident": { + "WalletAddressImportReport": { "type": "object", - "required": [ - "id", - "service", - "service_name", - "state", - "status", - "title", - "body", - "affected", - "country_name", - "started_at", - "resolved_at", - "duration_minutes" - ], + "description": "What happened to each row of an import, in the order sent.", "properties": { - "id": { - "type": "string", - "format": "uuid", - "description": "Incident ID.", - "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6" + "total": { + "type": "integer" }, - "service": { - "type": "string", - "enum": [ - "service_id_verification", - "service_liveness_face_match", - "service_aml_screening", - "service_kyb_registries", - "service_database_validation", - "service_phone_delivery", - "service_email_delivery", - "service_transaction_monitoring" - ], - "description": "Key of the affected service (see `services[].key`).", - "example": "service_database_validation" + "created": { + "type": "integer" }, - "service_name": { - "type": "string", - "description": "English display name of the affected service.", - "example": "Database validation" + "existing": { + "type": "integer" }, - "state": { + "duplicate": { + "type": "integer" + }, + "failed": { + "type": "integer" + }, + "rows": { + "type": "array", + "items": { + "type": "object", + "properties": { + "row": { + "type": "integer", + "description": "The row's number, from 1." + }, + "status": { + "type": "string", + "enum": [ + "created", + "existing", + "duplicate", + "failed" + ], + "description": "`created`: added to the book. `existing`: the wallet is already in the book and was left untouched. `duplicate`: repeats an earlier row of this import. `failed`: see `errors`." + }, + "entry_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The address-book entry the row created or found." + }, + "errors": { + "type": "object", + "description": "Field errors of a `failed` row; empty otherwise." + }, + "duplicate_of_row": { + "type": "integer", + "nullable": true, + "description": "On a `duplicate` row, the row it repeats." + } + } + } + } + } + }, + "TravelRuleCounterpartyContact": { + "type": "object", + "description": "A compliance address the EMAIL rail writes to for one directory entry.", + "properties": { + "uuid": { "type": "string", - "enum": [ - "degraded", - "down" - ], - "description": "How the service is affected. A resolved incident keeps the last state it had.", - "example": "degraded" + "format": "uuid" }, - "status": { + "counterparty": { "type": "string", - "enum": [ - "ongoing", - "resolved" - ], - "description": "`ongoing` until the service recovers, then `resolved`.", - "example": "ongoing" + "format": "uuid", + "description": "The directory entry's `id`, as GET /v3/travel-rule/vasps/ shows it." }, - "title": { + "counterparty_name": { + "type": "string" + }, + "email": { "type": "string", - "description": "English headline. To translate it, build your own text from `service`, `state` and `country_name`.", - "example": "Database validation is degraded in Brazil." + "format": "email" }, - "body": { + "name": { "type": "string", - "description": "English detail line: since when checks may be slow or fail, or when it recovered.", - "example": "Checks against Brazil (CPF) may be slow or fail since 08:55 UTC." + "description": "Optional label, for example the team name." }, - "affected": { + "source": { "type": "string", - "description": "Countries or registries affected, for example `Brazil (CPF)`. Empty when the incident is not tied to a country or registry.", - "example": "Brazil (CPF)" + "enum": [ + "staff", + "application", + "learned" + ], + "description": "staff: curated by Didit. learned: an address at one of the VASP's own domains that answered a request through its response link. application: added by your application." }, - "country_name": { + "scope": { "type": "string", - "description": "Country affected, in English. Empty when the incident is not tied to a country.", - "example": "Brazil" + "enum": [ + "platform", + "application" + ], + "description": "platform: curated by Didit or learned from a verified answer, used for every Didit customer, read-only for you. application: private to your application." }, - "started_at": { + "created_by": { "type": "string", - "format": "date-time", - "description": "When the incident started (ISO 8601, UTC).", - "example": "2026-10-13T08:55:00Z" + "description": "Empty for platform contacts and for contacts an API key added." }, - "resolved_at": { + "verified_at": { "type": "string", "format": "date-time", "nullable": true, - "description": "When the service recovered (ISO 8601, UTC). `null` while the incident is ongoing." + "description": "When this address last answered a request through its response link." }, - "duration_minutes": { - "type": "integer", - "nullable": true, - "description": "Whole minutes from `started_at` to `resolved_at`. `null` while the incident is ongoing." - } - } - }, - "TravelRuleJoinInvitation": { - "type": "object", - "description": "What the join page shows before anything is typed.", - "properties": { - "email": { - "type": "string", - "format": "email", - "description": "The address the invitation went to." + "is_invalid": { + "type": "boolean", + "description": "true once the address bounced or complained; the EMAIL rail skips it." }, - "vasp_name": { - "type": "string" + "invalid_reason": { + "type": "string", + "enum": [ + "", + "hard_bounce", + "soft_bounce", + "spam_complaint", + "suppressed" + ] }, - "source": { + "invalid_detail": { "type": "string", - "description": "Where the invitation came from, for example `pickup`." + "description": "The receiving mail server's reason, when it gave one." }, - "expires_at": { + "invalid_at": { "type": "string", "format": "date-time", "nullable": true }, - "prefill": { - "type": "object", - "properties": { - "vasp_id": { - "type": "string", - "format": "uuid", - "nullable": true - }, - "legal_name": { - "type": "string" - }, - "lei": { - "type": "string" - }, - "jurisdiction": { - "type": "string" - }, - "domains": { - "type": "array", - "items": { - "type": "string" - } - } - } + "created_at": { + "type": "string", + "format": "date-time" } } }, - "TravelRuleJoinRegisterRequest": { + "TravelRuleCounterpartyContactCreate": { "type": "object", "required": [ - "email", - "password" + "counterparty", + "email" ], "properties": { - "email": { + "counterparty": { "type": "string", - "format": "email", - "maxLength": 254, - "description": "Must be the address the invitation went to." + "format": "uuid", + "description": "The directory entry's `id`." }, - "password": { - "type": "string", - "minLength": 8, - "maxLength": 128 - } - } - }, - "TravelRuleJoinVerifyRequest": { - "type": "object", - "required": [ - "email", - "code" - ], - "properties": { "email": { "type": "string", "format": "email", "maxLength": 254 }, - "code": { + "name": { "type": "string", - "minLength": 6, - "maxLength": 6, - "description": "The 6-character code emailed after registering." + "description": "Optional label.", + "maxLength": 255 } } }, - "TravelRuleJoinCredentials": { + "TravelRuleNameMatch": { "type": "object", - "description": "The new free organization and the credentials its application calls the API with.", + "nullable": true, + "description": "The name comparison that decided the transfer, or null until one ran. While the parties are masked, and on the other customer's copy of an INTERNAL exchange, `transfer_name`, `compared_name`, `matched_names` and `mismatched_names` are hidden. `score` and `matched` can disagree: `matched` follows the strictness, `score` is the similarity of the two full names.", "properties": { - "organization": { - "type": "object", - "properties": { - "uuid": { - "type": "string", - "format": "uuid" - } - } + "score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "description": "Similarity of the two full names, 0 to 100. 0 when either name is blank." }, - "application": { - "type": "object", - "properties": { - "uuid": { - "type": "string", - "format": "uuid" - } - } + "matched": { + "type": "boolean", + "description": "Whether the names satisfy `strictness`. The transfer's outcome follows `data_match`, which compares every field, so a transfer can be COUNTERPARTY_MISMATCHED_DATA while this is true." }, - "client_id": { - "type": "string" + "method": { + "type": "string", + "enum": [ + "none", + "exact_token", + "token_subset", + "token_containment", + "sequence_ratio" + ], + "description": "How `matched` was decided: none (`NONE`), exact_token (`STRICT`), token_subset (`DEFAULT`), token_containment (`CONTAINS`) or sequence_ratio (`FUZZY`)." }, - "api_key": { + "strictness": { "type": "string", - "description": "Send as the `x-api-key` header on the workspace endpoints." - } - } - }, - "TravelRuleWorkspaceClaimRequest": { - "type": "object", - "required": [ - "vasp_id" - ], - "properties": { - "vasp_id": { + "enum": [ + "NONE", + "STRICT", + "CONTAINS", + "DEFAULT", + "FUZZY" + ] + }, + "compared_with": { "type": "string", - "format": "uuid", - "description": "The directory entry this workspace is. Read ids from `GET /v3/travel-rule/vasps/`." - } - } - }, - "TravelRuleWorkspaceDomainConfirmRequest": { - "type": "object", - "required": [ - "code" - ], - "properties": { - "code": { + "enum": [ + "wallet_holder", + "counterparty_vasp" + ], + "description": "wallet_holder: the holder recorded for the wallet. counterparty_vasp: the name the counterparty answered on the email response page, or the Didit Test VASP's answer in sandbox." + }, + "transfer_name": { "type": "string", - "minLength": 6, - "maxLength": 6 - } - } - }, - "TravelRuleWorkspaceBillingRequest": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "default": true, - "description": "Only `true` is accepted: outbound billing cannot be turned back off through the API." - } - } - }, - "TravelRuleWorkspaceDomainCodeResponse": { - "type": "object", - "properties": { - "domain": { - "type": "string" + "description": "The name on the transfer." }, - "status": { + "compared_name": { "type": "string", - "enum": [ - "unverified", - "code_sent", - "verified" - ] + "description": "The name it was compared with." }, - "txt": { - "$ref": "#/components/schemas/TravelRuleWorkspaceTxtRecord" + "matched_names": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Words of `transfer_name` found in `compared_name`." + }, + "mismatched_names": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Words of `transfer_name` missing from `compared_name`, then words of `compared_name` missing from `transfer_name`." } } }, - "TravelRuleWorkspaceTxtRecord": { + "TravelRuleTransferRow": { "type": "object", - "description": "The TXT record to publish for the DNS proof. Empty until a proof has been started.", + "description": "One Travel Rule transfer as the transfers list shows it: VASP names, wallets and memos only, never the originator or beneficiary person data.", "properties": { - "host": { + "id": { "type": "string", - "example": "didit-tr-verify.example.com" + "format": "uuid", + "description": "The transfer's id." }, - "value": { - "type": "string" - } - } - }, - "TravelRuleWorkspace": { - "type": "object", - "description": "The free Travel Rule workspace of an application that joined free.", - "properties": { - "joined_free": { - "type": "boolean" + "transaction_id": { + "type": "string", + "format": "uuid", + "description": "The Didit transaction the transfer belongs to." }, - "work_email": { + "txn_id": { "type": "string", - "format": "email" + "nullable": true, + "description": "Your own id for the transaction. Transfers Didit books for you, such as a Didit Test VASP inbound transfer, carry a generated one." }, - "joined_at": { + "txn_date": { "type": "string", - "format": "date-time", - "nullable": true + "format": "date-time" }, - "claim": { - "type": "object", - "properties": { - "status": { - "type": "string", - "enum": [ - "unclaimed", - "pending_review", - "claimed", - "rejected" - ] - }, - "proved_by_domain": { - "type": "boolean" - }, - "claimed_at": { - "type": "string", - "format": "date-time", - "nullable": true - }, - "reviewed_at": { - "type": "string", - "format": "date-time", - "nullable": true - }, - "review_note": { - "type": "string" - }, - "vasp_id": { - "type": "string", - "format": "uuid", - "nullable": true - }, - "vasp_name": { - "type": "string" - } - } + "kind": { + "type": "string", + "enum": [ + "withdrawal", + "deposit", + "message" + ], + "description": "withdrawal: outbound. message: an inbound transfer a rail created from a counterparty's message (a TRP inquiry, the INTERNAL inbound leg, or a GTR, VerifyVASP or Sygna Bridge message). deposit: any other inbound transfer." }, - "prefill": { - "type": "object", - "description": "Profile values taken from the directory entry: `vasp_id`, `legal_name`, `lei`, `jurisdiction`, `compliance_email`, `domains`. Nothing is written until the claim is made." + "direction": { + "type": "string", + "enum": [ + "INBOUND", + "OUTBOUND" + ] }, - "domain": { - "type": "object", - "properties": { - "domain": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "unverified", - "code_sent", - "verified" - ] - }, - "verified_at": { - "type": "string", - "format": "date-time", - "nullable": true - }, - "txt": { - "$ref": "#/components/schemas/TravelRuleWorkspaceTxtRecord" - } - } + "status": { + "type": "string", + "enum": [ + "AWAITING_COUNTERPARTY", + "ON_HOLD", + "COMPLETED", + "FINISHED", + "CANCELLED", + "EXPIRED", + "COUNTERPARTY_MISMATCHED_DATA", + "COUNTERPARTY_VASP_NOT_FOUND", + "COUNTERPARTY_VASP_NOT_REACHABLE", + "UNCONFIRMED_OWNERSHIP", + "COUNTERPARTY_VASP_GENERAL_DECLINE", + "NOT_ENOUGH_COUNTERPARTY_DATA", + "NOT_APPLICABLE" + ] }, - "billing_enabled": { - "type": "boolean", - "description": "Receiving Travel Rule data is free. Sending is billed only after billing is enabled." + "reason": { + "type": "string", + "description": "Why a `COUNTERPARTY_VASP_NOT_FOUND` or `COUNTERPARTY_VASP_NOT_REACHABLE` transfer is stuck, the same value as the transfer's own `reason`, so the list tells a bounced compliance email from a counterparty with no route without opening each transfer. `\"\"` for any other status. See [Why a transfer is stuck](/transaction-monitoring/travel-rule#why-a-transfer-is-stuck)." }, - "billing_enabled_at": { + "rail": { "type": "string", - "format": "date-time", - "nullable": true + "nullable": true, + "enum": [ + "INTERNAL", + "TRP", + "GTR", + "TRUST", + "VERIFYVASP", + "SYGNA", + "EMAIL", + "TEST_VASP", + null + ] }, - "didit_network": { - "type": "object", - "description": "Whether the Didit network lists this VASP and, when not, each condition it still misses." + "asset": { + "type": "string", + "description": "The transaction's currency." }, - "settings": { - "$ref": "#/components/schemas/TravelRuleSettingsDetail" - } - } - }, - "InvestigatorDecision": { - "type": "object", - "description": "How the item left the Investigator queue. `decided_by`, `original_outcome` and `overrides` are returned by the accept and override endpoints and the report; the `investigator` block of a session decision carries the other fields.", - "properties": { - "outcome": { + "amount": { "type": "string", - "enum": [ - "accepted", - "edited", - "overridden", - "decided_elsewhere", - "automated" - ], - "description": "`accepted` or `edited` took the recommendation (`edited` with a rewritten narrative), `overridden` took another action, `decided_elsewhere` is a decision taken outside the Investigator while the report was open, `automated` is a decision the Investigator took on its own." + "description": "The amount as a plain decimal, for example \"1.25\"." }, - "action": { + "originator_vasp": { "type": "string", - "enum": [ - "approve", - "decline", - "escalate", - "request" - ] + "description": "Outbound: your VASP's legal name. Inbound: the counterparty's name, from its directory entry, the Didit network member, the TRP sender, the Didit Test VASP, or the name the transfer declared. Empty when none is known." }, - "actor_email": { + "beneficiary_vasp": { "type": "string", - "nullable": true + "description": "Outbound: the counterparty's name, worked out the same way. Inbound: your VASP's legal name." }, - "actor_name": { + "originator_wallet": { + "type": "string" + }, + "beneficiary_wallet": { + "type": "string" + }, + "originator_memo": { "type": "string", - "nullable": true + "description": "Memo or destination tag, empty on chains without one." }, - "override_category": { + "beneficiary_memo": { + "type": "string" + }, + "originator_wallet_type": { "type": "string", "enum": [ - "missing_context", - "needs_information", - "policy_differs", - "evidence_misread", - "other", - "" + "vasp", + "self_hosted", + "own" ], - "nullable": true + "description": "vasp, self_hosted (declared unhosted) or own (a wallet your address book records as yours). Your own side is always vasp." }, - "override_reason": { + "beneficiary_wallet_type": { "type": "string", - "nullable": true + "enum": [ + "vasp", + "self_hosted", + "own" + ] }, - "final_status": { + "matched_transaction_id": { "type": "string", - "description": "The item's status after the decision." + "format": "uuid", + "nullable": true, + "description": "The other side of a deposit you matched to an announced transfer by hand." }, - "agreed": { - "type": "boolean", - "description": "Whether the decision matched the recommendation.", - "nullable": true + "deadline_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the transfer expires if it is still waiting on its counterparty. Set on every transfer you create with `POST /v3/transactions/` that needs an exchange, outbound or inbound. Null below the threshold, on a Lightning payment the Travel Rule does not apply to, and on inbound transfers Didit creates when a counterparty reaches you (an inbound TRP inquiry, a network message or the INTERNAL inbound leg)." }, - "decided_at": { + "created_at": { "type": "string", "format": "date-time" + } + } + }, + "BankAccountCheckHolder": { + "description": "The name the account is checked against. Send exactly one of `full_name` and `business_name`.", + "oneOf": [ + { + "$ref": "#/components/schemas/BankAccountCheckPersonHolder" }, - "billed": { - "type": "boolean", - "description": "The review was charged." - }, - "decided_by": { + { + "$ref": "#/components/schemas/BankAccountCheckBusinessHolder" + } + ] + }, + "BankAccountCheckRequest": { + "type": "object", + "required": [ + "country", + "account", + "holder" + ], + "properties": { + "country": { "type": "string", - "enum": [ - "investigator", - "member" - ] + "minLength": 3, + "maxLength": 3, + "description": "The account's country, as an ISO 3166-1 alpha-3 code, for example `GBR`. Lowercase is accepted.", + "example": "GBR" }, - "original_outcome": { + "account": { "type": "object", - "description": "The decision the Investigator took on its own, unchanged by later overrides. Null for a decision the team took.", + "description": "The account the way its country writes it: an `iban`, or an `account_number` with the bank or branch code the country needs (`sort_code`, `routing_number`, `transit_institution`, `bsb`, `ifsc`, `bank_code` or `bic`). Mexico takes a `clabe` and Argentina a `cbu_cvu`, which already name the bank. A business account adds a `registration_id` where the country asks for one. Spaces, dashes and dots are ignored. Keys the country's check does not use are ignored; a key it needs and does not get is a `400` that names it.", "properties": { - "action": { - "type": "string" + "iban": { + "type": "string", + "maxLength": 64, + "description": "The IBAN, in a country that uses IBANs. It must belong to `country`." }, - "final_status": { - "type": "string" + "account_number": { + "type": "string", + "maxLength": 64, + "description": "The account number, in a country that writes the account with a separate bank or branch code." }, - "decided_at": { + "sort_code": { "type": "string", - "format": "date-time" + "maxLength": 64, + "description": "United Kingdom: the 6-digit sort code." + }, + "routing_number": { + "type": "string", + "maxLength": 64, + "description": "United States: the 9-digit ABA routing number." + }, + "transit_institution": { + "type": "string", + "maxLength": 64, + "description": "Canada: the 8-digit transit and institution number." + }, + "bsb": { + "type": "string", + "maxLength": 64, + "description": "Australia: the 6-digit BSB." + }, + "ifsc": { + "type": "string", + "maxLength": 64, + "description": "India: the 11-character IFSC." + }, + "bank_code": { + "type": "string", + "maxLength": 64, + "description": "The bank's code, where the country needs one, for example in Nigeria." + }, + "bic": { + "type": "string", + "maxLength": 64, + "description": "The bank's BIC, where the country's check asks for one." + }, + "clabe": { + "type": "string", + "maxLength": 64, + "description": "Mexico: the 18-digit CLABE. It already names the bank." + }, + "cbu_cvu": { + "type": "string", + "maxLength": 64, + "description": "Argentina: the 22-digit CBU or CVU. It already names the bank." + }, + "registration_id": { + "type": "string", + "maxLength": 64, + "description": "A business account's registration number, where the country asks for one." } }, - "nullable": true - }, - "overrides": { - "type": "array", - "description": "Every override of a decision the Investigator took on its own, oldest first.", - "items": { - "type": "object", - "properties": { - "action": { - "type": "string" - }, - "actor_email": { - "type": "string", - "nullable": true - }, - "actor_name": { - "type": "string", - "nullable": true - }, - "override_category": { - "type": "string" - }, - "override_reason": { - "type": "string" - }, - "previous_status": { - "type": "string" - }, - "final_status": { - "type": "string" - }, - "agreed": { - "type": "boolean", - "nullable": true - }, - "overridden_at": { - "type": "string", - "format": "date-time" - } - } + "additionalProperties": { + "type": "string", + "maxLength": 64 + }, + "example": { + "sort_code": "20-45-67", + "account_number": "31926819" } + }, + "holder": { + "$ref": "#/components/schemas/BankAccountCheckHolder" + }, + "vendor_data": { + "type": "string", + "nullable": true, + "description": "Your own reference for this check, returned unchanged.", + "example": "payout_20481" } } }, - "InvestigatorBlock": { + "BankAccountCheckResponse": { "type": "object", - "nullable": true, - "description": "The item's latest Investigator review, or null when it never had one. Carried by the V3 session and business session decision (and so by `status.updated` webhooks).", + "required": [ + "request_id", + "result", + "holder_name", + "account", + "vendor_data", + "created_at" + ], "properties": { - "run_id": { + "request_id": { "type": "string", - "format": "uuid" + "format": "uuid", + "description": "The ID of this check." }, - "status": { + "result": { "type": "string", "enum": [ - "running", - "completed", - "failed" - ] + "match", + "close_match", + "no_match", + "cannot_verify" + ], + "description": "`match`: the bank holds the account under the name you sent. `close_match`: under a close name, for example a missing middle name or a typo. `no_match`: under another name, or there is no such account. `cannot_verify`: the bank answered without comparing the name, for example for a blocked or closed account." }, - "stage": { + "holder_name": { "type": "string", - "enum": [ - "shadow", - "live" - ] + "nullable": true, + "description": "Only on a `close_match`, and only when the bank returned it: the name on the account, as the bank holds it. `null` otherwise." }, - "queue": { + "account": { "type": "string", - "enum": [ - "kyc", - "kyb", - "aml", - "transactions", - "cases" - ] - }, - "is_open": { - "type": "boolean" + "description": "The account, masked to its last 4 characters." }, - "recommendation": { + "vendor_data": { "type": "string", - "enum": [ - "approve", - "decline", - "escalate", - "request" - ], - "nullable": true + "nullable": true, + "description": "Your own reference, as you sent it." }, - "recommendation_detail": { + "created_at": { "type": "string", - "nullable": true - }, - "confidence": { + "format": "date-time", + "description": "When the check ran, in UTC." + } + } + }, + "BankAccountCheckError": { + "type": "object", + "required": [ + "detail" + ], + "properties": { + "detail": { "type": "string", - "enum": [ - "high", - "moderate", - "low" - ], - "nullable": true + "description": "What went wrong, in English." }, - "summary": { + "code": { "type": "string", - "nullable": true - }, - "ready_to_accept": { - "type": "boolean" + "description": "A stable code to branch on. Absent on `401` and `403`." }, - "prepared_at": { + "field": { "type": "string", - "format": "date-time", - "nullable": true - }, - "automated": { - "type": "boolean", - "description": "The Investigator decided on its own, even if the decision was later overridden." + "description": "`400` only: the body field to correct, as a dotted path, for example `account.sort_code`." }, - "decided_by": { + "reason": { "type": "string", "enum": [ - "investigator", - "member" - ], - "nullable": true - }, - "decision": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/InvestigatorDecision" - } + "required", + "length", + "format", + "checksum", + "country_mismatch", + "rejected" ], - "type": "object" + "description": "`400` only: why the field was refused. `required`, `length`, `format`, `checksum` and `country_mismatch` (an IBAN of another country) are Didit's own checks; `rejected` means the bank refused the account as sent." } } }, - "InvestigatorQueueRow": { + "BankVerificationResult": { "type": "object", + "description": "One Bank Verification step's result, for User and Business Verification. `method` says how the account was verified, and `none` that the person continued without a bank before any attempt was evaluated. `continued_without_bank` says the person continued without a bank, also after an evaluated attempt. See [Bank verification methods](/core-technology/bank-verification/verification-methods) and [When the person cannot verify their bank](/core-technology/bank-verification/fallbacks).", "properties": { - "run_id": { - "type": "string", - "format": "uuid" + "schema_version": { + "type": "integer", + "description": "Version of this result shape. `1` today." }, - "kind": { + "bank_verification_id": { "type": "string", - "enum": [ - "session", - "business_session", - "transaction", - "case" - ] + "format": "uuid", + "description": "The ID of this result." }, - "queue": { + "node_id": { "type": "string", - "enum": [ - "kyc", - "kyb", - "aml", - "transactions", - "cases" - ] + "description": "The workflow node this result belongs to." }, - "stage": { + "status": { "type": "string", "enum": [ - "shadow", - "live" - ] + "Not Finished", + "Approved", + "Declined", + "In Review", + "Expired" + ], + "description": "The step's verdict, after its actions and status rules." }, - "subject": { - "type": "object", - "description": "The item under review: `id`, `number`, `status`, `name` and, depending on the kind, `country`, `workflow`, `vendor_data`, `txn_id`, `amount`, `currency`, `direction`, `title` or `priority`.", - "additionalProperties": true + "original_status": { + "type": "string", + "nullable": true, + "description": "The first verdict the step reached, before any later change such as a manual review." }, - "recommendation": { + "method": { "type": "string", + "nullable": true, "enum": [ - "approve", - "decline", - "escalate", - "request" - ] + "open_banking", + "account_lookup", + "microdeposits", + "statement", + "none" + ], + "description": "How the account was verified: `open_banking` (bank sign-in: the person signed in at their bank), `account_lookup` (account check: the person typed the account details and the bank confirmed the name), `microdeposits` or `statement` (a statement upload). `none` when the person continued without a bank before any attempt was evaluated, so no account was verified. After an evaluated attempt, it stays the method of that attempt. `null` until an account is evaluated, and when the workflow narrows the data it returns. Workflow rules read the same value as `bank.method`." }, - "recommendation_detail": { - "type": "string" + "provider": { + "type": "string", + "nullable": true, + "description": "The key of the route that ran the connection. Read `method`, not this key, to tell how the account was verified." }, - "confidence": { + "credential_source": { "type": "string", + "nullable": true, "enum": [ - "high", - "moderate", - "low" - ] - }, - "summary": { - "type": "string" - }, - "sources_count": { - "type": "integer" - }, - "ready_to_accept": { - "type": "boolean" - }, - "guardrails": { - "description": "The locked guardrails that hold this item, if any." + "native", + "byok" + ], + "description": "`native`: Didit's own route, billed to your Didit balance. `byok`: a marketplace provider you connected with your own credentials." }, - "waiting_since": { - "type": "string", - "format": "date-time", - "nullable": true + "route": { + "type": "object", + "nullable": true, + "description": "The route chosen before consent. It never changes afterwards.", + "properties": { + "provider_key": { + "type": "string", + "nullable": true, + "description": "The route's key." + }, + "credential_source": { + "type": "string", + "enum": [ + "native", + "byok" + ] + }, + "is_fallback": { + "type": "boolean", + "description": "Whether Didit's own route stood in for a marketplace provider that could not connect." + }, + "provider_connection_id": { + "type": "string", + "nullable": true, + "description": "The marketplace connection used, for `byok`." + }, + "requested_scopes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The data the connection asked for, for example `ownership` or `balances`." + } + } }, - "due_at": { - "type": "string", - "format": "date-time", - "nullable": true + "connection": { + "type": "object", + "nullable": true, + "description": "The latest attempt's connection. `null` before the first attempt.", + "properties": { + "status": { + "type": "string", + "enum": [ + "pending", + "connected", + "cancelled", + "timeout", + "failed", + "unsupported", + "revoked", + "expired" + ] + }, + "institution_id": { + "type": "string", + "nullable": true, + "description": "The bank's ID. `null` for an account check, where no bank is picked." + }, + "institution_name": { + "type": "string", + "nullable": true, + "description": "The bank's name. `null` for an account check." + }, + "institution_country": { + "type": "string", + "nullable": true, + "description": "The account's country, ISO 3166-1 alpha-3." + }, + "oauth": { + "type": "boolean", + "nullable": true, + "description": "Whether the bank sign-in ran over OAuth or app-to-app. `null` for an account check." + }, + "connected_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the connection succeeded." + }, + "consent_expires_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the bank consent ends, for bank sign-in." + }, + "last_refreshed_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the financial data was last read again." + }, + "attempts": { + "type": "integer", + "description": "The attempts the person spent on this step, every method together." + }, + "reason_code": { + "type": "string", + "nullable": true, + "description": "Why the connection is not simply `connected`, for example `USER_CANCELLED`, `INSTITUTION_DOWN`, `ACCOUNT_NOT_FOUND`, `REFERENCE_IDENTITY_MISSING` or `VERIFICATION_COMPLETED`." + } + } }, - "prepared_at": { - "type": "string", - "format": "date-time", - "nullable": true - } - } - }, - "InvestigatorRunDetail": { - "allOf": [ - { - "$ref": "#/components/schemas/InvestigatorQueueRow" + "account": { + "type": "object", + "nullable": true, + "description": "The evaluated account. `null` until an account is evaluated.", + "properties": { + "account_id_masked": { + "type": "string", + "nullable": true, + "description": "The account number, masked." + }, + "iban_masked": { + "type": "string", + "nullable": true, + "description": "The IBAN, masked." + }, + "sort_code": { + "type": "string", + "nullable": true, + "description": "The sort code, in the United Kingdom." + }, + "routing_number_masked": { + "type": "string", + "nullable": true, + "description": "The routing number, masked." + }, + "type": { + "type": "string", + "nullable": true, + "enum": [ + "checking", + "current", + "savings", + "business", + "other" + ] + }, + "subtype": { + "type": "string", + "nullable": true, + "description": "The bank's own account subtype." + }, + "currency": { + "type": "string", + "nullable": true, + "description": "ISO 4217 currency of the account." + }, + "holder_type": { + "type": "string", + "nullable": true, + "enum": [ + "person", + "business", + "unknown" + ] + }, + "holders_count": { + "type": "integer", + "nullable": true + }, + "is_joint": { + "type": "boolean", + "nullable": true + }, + "is_business": { + "type": "boolean", + "nullable": true + } + } }, - { + "ownership": { "type": "object", + "nullable": true, + "description": "How the account holder compared with the verified identity. `null` until an account is evaluated.", "properties": { - "status": { - "type": "string" + "result": { + "type": "string", + "enum": [ + "match", + "partial_match", + "no_match", + "unknown", + "not_verifiable" + ], + "description": "`partial_match` is a close match. `not_verifiable`: the bank answered with no holder to compare. `unknown`: the evidence could not be read, or there was no identity to compare." }, - "is_open": { - "type": "boolean" + "reference_identity_source": { + "type": "string", + "nullable": true, + "description": "The step whose identity the holder was compared against: `kyc`, `database_validation`, `expected_details`, `questionnaire`, `document_ai` or `kyb`." }, - "lookups": { + "name_score": { "type": "integer", - "description": "How many sections and linked records it read." + "minimum": 0, + "maximum": 100, + "nullable": true, + "description": "Didit's holder name score." }, - "duration_ms": { + "provider_name_score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "nullable": true, + "description": "The bank's own holder name score, when it returned one." + }, + "address_score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "nullable": true, + "description": "The holder address score, when address matching ran." + }, + "email_score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "nullable": true, + "description": "The holder email score, when email matching ran." + }, + "phone_score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "nullable": true, + "description": "The holder phone score, when phone matching ran." + }, + "dob_score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "nullable": true, + "description": "The holder date of birth score, when the bank shared one." + }, + "close_match": { + "type": "boolean", + "nullable": true, + "description": "Whether the name landed in the close-match band." + }, + "holder_confirmation": { + "type": "string", + "nullable": true, + "enum": [ + "pending", + "confirmed", + "rejected" + ], + "description": "The person's answer when asked to confirm a close-match name. `null` when never asked." + }, + "method": { + "type": "string", + "nullable": true, + "enum": [ + "exact", + "token_set", + "nickname", + "transliteration", + "fuzzy", + "provider_only", + "microdeposits" + ], + "description": "Which name comparison produced the score. This is not the verification method: read the top-level `method` for that." + }, + "matched_holder_index": { "type": "integer", "nullable": true }, - "agent_version": { - "type": "string" + "holders": { + "type": "array", + "items": { + "type": "object" + }, + "description": "Each holder the bank listed, with its scores." }, - "prepared_before_opened": { + "owner_identity_available": { "type": "boolean", "nullable": true }, - "report": { + "evidence_freshness": { + "type": "string", + "nullable": true, + "enum": [ + "live", + "cached", + "refreshed" + ] + }, + "evaluated_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the verdict was computed." + } + } + }, + "financial_data": { + "type": "object", + "description": "The financial data the step read. Only bank sign-in reads it.", + "properties": { + "balances": { "type": "object", - "additionalProperties": true, - "description": "The report: reasoning, evidence points with their verdict (`ok`, `risk`, `look`, `explained`, `context`) and cited sources, screening hit verdicts (`same`, `not_same`, `unclear`) and suggested next steps." + "nullable": true, + "description": "With the `balances` scope." }, - "trail": { - "description": "What I checked: the overview, sections and records it read, in order." + "transactions": { + "type": "object", + "nullable": true, + "description": "With the `transactions` scope." }, - "decision": { + "income": { + "type": "object", "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/InvestigatorDecision" - } - ], - "type": "object" + "description": "With the `income` scope." }, - "autonomy": { + "categorization": { "type": "object", - "additionalProperties": true, - "description": "What autonomy made of the report (`result`, `reason`, `tier`, `policy_version`, `rule`, `agreement`, `decisions`, `threshold`, `at`). Null when the queue is not automated.", - "nullable": true + "nullable": true, + "description": "Didit's categorization of the transactions read. `null` without them." + }, + "not_collected": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "balances", + "income", + "transactions" + ] + }, + "description": "The data the step asked for that the method which verified the account does not collect. Balances, transactions and income come from bank sign-in only, so an account verified by account check lists them here. Never a failure. Empty otherwise." } } - } - ] - }, - "InvestigatorAcceptRequest": { - "type": "object", - "properties": { - "narrative": { - "type": "string", - "maxLength": 4000, - "description": "A rewritten narrative. Sending one records the decision as edited and accepted." }, - "send_email": { + "billing": { + "type": "object", + "nullable": true, + "properties": { + "route": { + "type": "string", + "enum": [ + "native", + "byok" + ] + }, + "billed": { + "type": "boolean" + }, + "marketplace_fee": { + "type": "string", + "nullable": true, + "description": "The marketplace platform fee charged, for `byok`." + }, + "usage_type": { + "type": "string", + "nullable": true, + "description": "The usage line the charge was booked on: `bank_verification` for a bank sign-in or an account check, `bank_statement_upload` for a statement upload with no charged bank attempt before it, and `bank_byok_fee` for the marketplace fee on your own provider. `null` when nothing was billed." + } + } + }, + "reference_identity": { + "type": "object", + "nullable": true, + "description": "The identity the holder was compared against, with its source." + }, + "signals": { + "type": "object", + "nullable": true, + "description": "Account signals read from the transaction history, when the step read one." + }, + "connection_abandoned": { "type": "boolean", - "default": false, - "description": "Email the person about the decision." + "nullable": true, + "description": "Whether the step ended without a match after the person left at their bank." }, - "email_address": { - "type": "string", - "format": "email", - "description": "Required when `send_email` is true." + "not_covered": { + "type": "boolean", + "nullable": true, + "description": "Whether the person's bank or country could not be reached on this step. Also `true` when the person continued without a bank because no method could verify their country or bank." }, - "email_language": { - "type": "string", - "default": "en", - "maxLength": 16 - } - } - }, - "InvestigatorOverrideRequest": { - "type": "object", - "required": [ - "action", - "category", - "reason" - ], - "properties": { - "action": { - "type": "string", - "enum": [ - "approve", - "decline", - "escalate", - "request" - ] + "continued_without_bank": { + "type": "boolean", + "description": "Whether the person left the step with **Continue without your bank**. `continuation` then says why. `method` is `none` when no attempt was evaluated before they continued. After an evaluated attempt, such as a holder that does not match, `method` stays the method of that attempt and its verdict and reason codes stand. Returned even when the workflow narrows the data it returns." }, - "category": { - "type": "string", - "enum": [ - "missing_context", - "needs_information", - "policy_differs", - "evidence_misread", - "other" - ] + "continuation": { + "type": "object", + "nullable": true, + "description": "How the person continued without a bank. `null` when they did not. When the workflow narrows the data it returns, `reason` is still returned and every other key is `null`.", + "properties": { + "reason": { + "type": "string", + "enum": [ + "no_route", + "institution_unsupported", + "attempts_exhausted", + "person_choice" + ], + "description": "Why, as Didit worked it out when the person continued: `no_route` (no bank sign-in or account check serves their country), `institution_unsupported` (the bank they picked cannot be used on this step), `attempts_exhausted` (every attempt was already spent and none was in progress), or `person_choice` (a way to verify was there and they chose to continue, also when their bank could not be reached right now). `no_route` and `institution_unsupported` follow `bank_unsupported_action`, `attempts_exhausted` follows `bank_attempts_exhausted_action`, and `person_choice` follows `bank_skipped_action`, unless an evaluated attempt already decided the step." + }, + "country": { + "type": "string", + "nullable": true, + "description": "The country the person was verifying in, ISO 3166-1 alpha-3. `null` when they continued before picking one." + }, + "offered": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "statement", + "microdeposits" + ] + }, + "nullable": true, + "description": "The other ways to verify that country offered the person when they continued, in the order it offered them: `statement` (a statement upload), then `microdeposits`. Empty when it offered none." + }, + "institution_id": { + "type": "string", + "nullable": true, + "description": "For `institution_unsupported`, the ID of the bank the person could not use: the bank they picked, or the bank their last attempt ended on. Didit takes it from its own list of banks, never from the person's device, so a bank that list does not have is `null`. `null` for every other reason." + }, + "institution_name": { + "type": "string", + "nullable": true, + "description": "For `institution_unsupported`, the name of that bank, from the same list as `institution_id`. `null` when that list does not have the bank, and for every other reason." + }, + "continued_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the person continued." + } + } }, - "reason": { + "evidence_purged_at": { "type": "string", - "minLength": 10, - "maxLength": 500 + "format": "date-time", + "nullable": true, + "description": "When the bank evidence was deleted under `bank_evidence_retention_days`. `null` otherwise." }, - "send_email": { - "type": "boolean", - "default": false, - "description": "Email the person about the decision." + "warnings": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Informational codes, for example `holder_declared`. A warning never changes the status on its own." }, - "email_address": { + "reason_codes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Why the verdict came out the way it did, for example `OWNER_NAME_PARTIAL`. Several may apply. `NOT_COVERED`: the person continued without a bank because no method could verify their country or bank. `SKIPPED`: the person chose to continue without a bank while a way to verify was there. Neither is added when an evaluated attempt already decided the step." + }, + "created_at": { "type": "string", - "format": "email", - "description": "Required when `send_email` is true." + "format": "date-time" }, - "email_language": { + "updated_at": { "type": "string", - "default": "en", - "maxLength": 16 + "format": "date-time" } } }, - "InvestigatorBatchAcceptRequest": { + "BankAccountCheckPersonHolder": { "type": "object", + "description": "The person who should hold the account.", "required": [ - "run_ids" + "full_name" ], "properties": { - "run_ids": { - "type": "array", - "minItems": 1, - "maxItems": 50, - "items": { - "type": "string", - "format": "uuid" - } + "full_name": { + "type": "string", + "maxLength": 255, + "description": "The full name of the person who should hold the account.", + "example": "Maria Oliveira" } } }, - "InvestigatorBatchAcceptResponse": { + "BankAccountCheckBusinessHolder": { "type": "object", + "description": "The company that should hold the account. Checks a business account.", + "required": [ + "business_name" + ], "properties": { - "accepted": { - "type": "integer" - }, - "skipped": { - "type": "integer" - }, - "results": { - "type": "array", - "items": { - "type": "object", - "properties": { - "run_id": { - "type": "string", - "format": "uuid" - }, - "result": { - "type": "string", - "enum": [ - "accepted", - "skipped" - ] - }, - "reason": { - "type": "string", - "enum": [ - "not_found", - "forbidden", - "already_decided", - "not_ready", - "guardrail", - "invalid" - ] - }, - "detail": {}, - "action": { - "type": "string" - }, - "final_status": { - "type": "string" - } - } - } + "business_name": { + "type": "string", + "maxLength": 255, + "description": "The name of the company that should hold the account. Checks a business account." } } }, - "InvestigatorSettings": { + "BankVerificationPricing": { "type": "object", + "description": "Public Bank Verification list prices: the statement upload, the own provider key fee and each country's methods.", + "required": [ + "currency", + "statement_upload", + "own_provider_fee_usd", + "countries" + ], "properties": { - "stage": { + "currency": { "type": "string", "enum": [ - "none", - "shadow", - "live" - ] - }, - "stage_changed_at": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true + "USD" + ], + "description": "Currency of every price in the response.", + "example": "USD" }, - "stage_changed_by": { - "type": "string", - "readOnly": true + "statement_upload": { + "$ref": "#/components/schemas/BankStatementUploadPricing" }, - "monthly_spend_limit": { + "own_provider_fee_usd": { "type": "string", - "format": "decimal", - "description": "Monthly limit in your billing currency, 0.01 to 1,000,000. Null turns it off.", - "nullable": true + "description": "Fee for each billable ownership check on a route that uses your own provider contract instead of Didit's, charged whatever the result. A cancelled, timed out or abandoned connection is not billed. Decimal string with 4 decimals, in USD.", + "example": "0.0200" }, - "spend_limit": { + "countries": { "type": "object", - "readOnly": true, - "properties": { - "enabled": { - "type": "boolean" - }, - "limit": { - "type": "string", - "format": "decimal", - "nullable": true - }, - "spent": { - "type": "string", - "format": "decimal" - }, - "reviews": { - "type": "integer" - }, - "reserved": { - "type": "string", - "format": "decimal", - "description": "The price of every open live report, held back because accepting it charges it." - }, - "currency": { - "type": "string" - }, - "paused": { - "type": "boolean", - "description": "At the limit: no new review starts." - } + "description": "Every country, keyed by ISO 3166-1 alpha-3 code.", + "additionalProperties": { + "$ref": "#/components/schemas/BankVerificationPricingCountry" } } } }, - "TravelRuleUtxoEntry": { + "BankStatementUploadPricing": { "type": "object", - "description": "One input or output of a UTXO transaction, as the chain recorded it.", + "description": "How the bank statement upload is priced.", "required": [ - "address" + "price_usd", + "included_after_charged_bank_attempt", + "standalone_available" ], "properties": { - "address": { - "type": "string", - "maxLength": 128 - }, - "amount": { + "price_usd": { "type": "string", - "nullable": true, - "description": "Decimal string in the coin's own unit (BTC, not satoshis). Optional.", - "example": "0.0125" + "description": "Price of a statement upload after a charged bank attempt. Decimal string with 4 decimals, in USD.", + "example": "0.0000" }, - "txid": { - "type": "string", - "maxLength": 128, - "description": "Optional. The transaction an input spends." + "included_after_charged_bank_attempt": { + "type": "boolean", + "description": "`true` when the upload is included at no extra charge after a charged bank attempt in the same session.", + "example": true }, - "vout": { - "type": "integer", - "nullable": true, - "minimum": 0, - "description": "Optional. The output index an input spends." + "standalone_available": { + "type": "boolean", + "description": "`true` when a statement upload can run on its own, with no bank attempt first. `false` in production; sandbox sessions can test it without billing.", + "example": false } } }, - "TravelRuleUtxo": { + "BankVerificationPricingCountry": { "type": "object", - "description": "The inputs and outputs of a UTXO transfer (BTC, LTC, BCH, DOGE). Only accepted on those chains: on any other chain it is a `400`. From them Didit infers the originator wallet (the declared one, else the input address that contributed the most) and the beneficiary output (the declared one, else the only output that does not pay an input address back as change, else the one output paying the transfer amount). The result is on the transfer's `chain_details`.", + "description": "One country's Bank Verification methods and their list prices.", "required": [ - "outputs" + "name", + "methods" ], "properties": { - "inputs": { - "type": "array", - "maxItems": 1000, - "items": { - "$ref": "#/components/schemas/TravelRuleUtxoEntry" - }, - "description": "Optional. Without inputs no originator is inferred and no change output is recognised." + "name": { + "type": "string", + "description": "Country name in English.", + "example": "United Kingdom" }, - "outputs": { - "type": "array", - "minItems": 1, - "maxItems": 1000, - "items": { - "$ref": "#/components/schemas/TravelRuleUtxoEntry" - } + "methods": { + "$ref": "#/components/schemas/BankVerificationPricingMethods" } } }, - "TravelRuleChainSide": { + "BankVerificationPricingMethods": { "type": "object", - "description": "One side's wallet as Didit resolved it from the chain data.", + "description": "The two Bank Verification methods in a country.", + "required": [ + "open_banking", + "account_lookup" + ], "properties": { - "address": { - "type": "string", - "description": "The wallet. On a memo network the classic address (an XRP X-address is split into its classic address and its tag); on Lightning the payee node id or Lightning Address." - }, - "memo": { - "type": "string", - "description": "The destination tag or memo that is part of the wallet; `\"\"` for none." + "open_banking": { + "$ref": "#/components/schemas/BankSignInPricing" }, - "source": { - "type": "string", - "enum": [ - "declared", - "x_address", - "largest_input", - "only_non_change_output", - "amount_match", - "invoice_payee", - "updated" - ], - "description": "Where the wallet came from: `declared` (your request), `x_address` (split from an XRP X-address), `largest_input` (the UTXO input address that contributed the most), `only_non_change_output` (the only UTXO output that is not change), `amount_match` (the one UTXO output paying the transfer amount), `invoice_payee` (the payee a Lightning payment request names), `updated` (set later with `action: update_originator_wallet`)." + "account_lookup": { + "$ref": "#/components/schemas/BankAccountCheckPricing" } } }, - "TravelRuleChainDetails": { + "BankSignInPricing": { "type": "object", - "description": "How the transfer's chain names its two wallets, when that is more than one address paying another. Empty (`{}`) for an account-chain transfer (EVM, Solana, Tron), where the two addresses are the wallets. Matching, routing and the address book read the wallets from here first.", + "description": "Bank sign-in: the person signs in to their bank. Priced by market, the same for every bank in it.", + "required": [ + "available", + "market", + "price_usd", + "add_ons" + ], "properties": { - "chain": { - "type": "string", - "description": "Canonical chain, e.g. `BTC`, `XRP`, or `LIGHTNING` for a Lightning transfer." + "available": { + "type": "boolean", + "description": "`true` only where Didit serves bank sign-in in this country in production.", + "example": true }, - "shape": { + "market": { "type": "string", - "enum": [ - "utxo", - "memo", - "lightning" - ] - }, - "originator": { - "$ref": "#/components/schemas/TravelRuleChainSide" + "nullable": true, + "description": "The market whose price applies. `null` when not available.", + "example": "UK and EEA" }, - "beneficiary": { - "$ref": "#/components/schemas/TravelRuleChainSide" + "price_usd": { + "type": "string", + "nullable": true, + "description": "List price of one bank sign-in. `null` when not available. Decimal string with 4 decimals, in USD.", + "example": "0.7900" }, - "utxo": { + "add_ons": { "type": "object", - "description": "On a UTXO transfer: the inputs and outputs as stored (amounts as decimal strings) and which outputs Didit read as what.", + "description": "Add-ons priced in this country, each a decimal string with 4 decimals in USD, added to the bank sign-in price. Only the add-ons the country offers are listed; empty when bank sign-in is not available.", "properties": { - "inputs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TravelRuleUtxoEntry" - } - }, - "outputs": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TravelRuleUtxoEntry" - } - }, - "change_output_indexes": { - "type": "array", - "items": { - "type": "integer" - }, - "description": "Outputs that pay an input address back." + "balance": { + "type": "string", + "description": "Account balance add-on.", + "example": "0.3500" }, - "beneficiary_output_index": { - "type": "integer", - "nullable": true, - "description": "The output that pays the beneficiary; null when none could be told apart." + "transactions": { + "type": "string", + "description": "Transactions add-on.", + "example": "1.3000" } } - }, - "lightning": { - "type": "object", - "description": "On a Lightning transfer: what the payment request says. Always `kind` (`bolt11`, `bolt12_offer`, `bolt12_invoice`, `bolt12_invoice_request`, `lnurl`, `lightning_address`, `node_id` or `unknown`); a BOLT11 invoice adds `network`, `payee_node_id`, `payment_hash`, `amount_msat`, `created_at` and `expires_at`; a BOLT12 string `blinded_paths` and `payee_node_id`; an LNURL or a Lightning Address its `domain`. Nothing is resolved over the network: the request is decoded only.", - "additionalProperties": true - }, - "warnings": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "declared_originator_not_an_input", - "declared_beneficiary_not_an_output", - "beneficiary_output_ambiguous", - "beneficiary_output_amount_differs" - ] - }, - "description": "UTXO inconsistencies worth a look: the declared originator is not an input, the declared beneficiary is not an output, no single beneficiary output could be told apart, or the beneficiary output pays a different amount than the transaction states." - }, - "not_applicable_reason": { - "type": "string", - "enum": [ - "LIGHTNING_NO_PAYEE_IDENTIFIER", - "LIGHTNING_BOLT12_BLINDED_PAYEE", - "LIGHTNING_LNURL_NAMES_NO_PAYEE" - ], - "description": "On an outbound Lightning transfer whose payment request names no payee: why the transfer is `NOT_APPLICABLE`. `LIGHTNING_NO_PAYEE_IDENTIFIER` (the request names no payee node, or could not be decoded), `LIGHTNING_BOLT12_BLINDED_PAYEE` (the offer hides its payee behind blinded paths), `LIGHTNING_LNURL_NAMES_NO_PAYEE` (an LNURL names a service, not a payee). The same code opens the transfer's last `timeline` entry." } } }, - "WalletAddressImportRow": { + "BankAccountCheckPricing": { "type": "object", - "description": "One wallet to import: by its `address`, its `address_hash`, or both. The camelCase forms of these fields are accepted too, as are `walletAddress`, `walletAddressHash`, `destinationTag` and `externalUserId`.", + "description": "Account check: the person types their account number and Didit checks it with the bank. Priced per country.", + "required": [ + "available", + "price_usd" + ], "properties": { - "address": { - "type": "string", - "maxLength": 128, - "description": "The wallet address. Alias: `walletAddress`." - }, - "address_hash": { - "type": "string", - "description": "SHA-256 of the lowercased address, as 64 hex characters or 44 base64 characters. Send it alone to register a wallet without disclosing its address; sent with `address`, it must be that address's hash. Alias: `walletAddressHash`." - }, - "chain": { - "type": "string", - "maxLength": 32 - }, - "memo": { - "type": "string", - "maxLength": 256, - "description": "The destination tag or memo. XRP: a destination tag, a whole number from 0 to 4294967295 (a JSON number is accepted). XLM: a text memo of up to 28 bytes, a 64-bit id or a 32-byte hash in hex. EOS: up to 256 bytes. ATOM: up to 256 characters. HBAR: up to 100 bytes. Bitcoin, EVM, Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin and Lightning wallets take no memo: one there is a `400`." - }, - "holder_name": { - "type": "string", - "maxLength": 255 - }, - "holder_vendor_data": { - "type": "string", - "maxLength": 255, - "description": "Your internal identifier for the holder. Alias: `externalUserId`." - }, - "entity_type": { - "type": "string", - "enum": [ - "individual", - "company" - ], - "default": "individual" - }, - "label": { - "type": "string", - "maxLength": 255 - }, - "owner_type": { - "type": "string", - "enum": [ - "customer", - "internal", - "vasp" - ], - "default": "customer" + "available": { + "type": "boolean", + "description": "`true` only where Didit serves the account check in this country in production.", + "example": true }, - "travel_address": { + "price_usd": { "type": "string", - "maxLength": 512 - }, - "self_declared": { - "type": "boolean", - "default": false, - "description": "Create the entry already verified through a self-declaration, when your settings allow it." + "nullable": true, + "description": "List price of one account check the bank answers. `null` when not available. Decimal string with 4 decimals, in USD.", + "example": "0.4000" } } }, - "WalletAddressImportReport": { + "ImportProvider": { "type": "object", - "description": "What happened to each row of an import, in the order sent.", "properties": { - "total": { - "type": "integer" - }, - "created": { - "type": "integer" + "key": { + "type": "string", + "enum": [ + "sumsub", + "jumio", + "veriff", + "onfido", + "persona", + "metamap", + "socure", + "idnow", + "shufti", + "idenfy", + "ondato", + "trulioo", + "au10tix", + "complycube", + "other" + ] }, - "existing": { - "type": "integer" + "name": { + "type": "string" }, - "duplicate": { - "type": "integer" + "mode": { + "type": "string", + "enum": [ + "api_list", + "api_ids", + "export_file" + ], + "description": "`api_list`: Didit lists records with the key. `api_ids`: upload the record IDs from an export. `export_file`: upload an export in Didit's format." }, - "failed": { - "type": "integer" + "record_noun": { + "type": "string" }, - "rows": { + "credential_fields": { "type": "array", "items": { "type": "object", "properties": { - "row": { - "type": "integer", - "description": "The row's number, from 1." - }, - "status": { - "type": "string", - "enum": [ - "created", - "existing", - "duplicate", - "failed" - ], - "description": "`created`: added to the book. `existing`: the wallet is already in the book and was left untouched. `duplicate`: repeats an earlier row of this import. `failed`: see `errors`." - }, - "entry_id": { - "type": "string", - "format": "uuid", - "nullable": true, - "description": "The address-book entry the row created or found." + "name": { + "type": "string" }, - "errors": { - "type": "object", - "description": "Field errors of a `failed` row; empty otherwise." + "label": { + "type": "string" }, - "duplicate_of_row": { - "type": "integer", - "nullable": true, - "description": "On a `duplicate` row, the row it repeats." + "secret": { + "type": "boolean" } } } + }, + "regions": { + "type": "array", + "items": { + "type": "string" + } + }, + "required_permissions": { + "type": "array", + "items": { + "type": "string" + } + }, + "docs_url": { + "type": "string", + "nullable": true + }, + "status_mapping": { + "type": "object", + "additionalProperties": { + "type": "string", + "enum": [ + "Approved", + "Declined", + "In Review", + "Expired", + "Not Finished", + "Abandoned" + ] + } } } }, - "TravelRuleCounterpartyContact": { + "ImportJobSummary": { "type": "object", - "description": "A compliance address the EMAIL rail writes to for one directory entry.", + "description": "One import job of any kind, in the shape the console's Import jobs drawer reads.", "properties": { - "uuid": { + "id": { "type": "string", "format": "uuid" }, - "counterparty": { + "kind": { "type": "string", - "format": "uuid", - "description": "The directory entry's `id`, as GET /v3/travel-rule/vasps/ shows it." + "enum": [ + "sessions", + "businesses", + "users", + "status_rules", + "transactions" + ] }, - "counterparty_name": { - "type": "string" + "source": { + "type": "string", + "enum": [ + "file", + "api", + "provider" + ] }, - "email": { + "provider": { "type": "string", - "format": "email" + "nullable": true }, - "name": { + "provider_name": { "type": "string", - "description": "Optional label, for example the team name." + "nullable": true }, - "source": { + "filename": { "type": "string", - "enum": [ - "staff", - "application", - "learned" - ], - "description": "staff: curated by Didit. learned: an address at one of the VASP's own domains that answered a request through its response link. application: added by your application." + "nullable": true }, - "scope": { + "state": { "type": "string", "enum": [ - "platform", - "application" + "ready", + "queued", + "running", + "paused", + "completed", + "errors", + "failed", + "cancelled" ], - "description": "platform: curated by Didit or learned from a verified answer, used for every Didit customer, read-only for you. application: private to your application." + "description": "The job's state as the console shows it; `errors` is a completed job with rejected rows." }, - "created_by": { + "status": { + "type": "string" + }, + "is_dry_run": { + "type": "boolean" + }, + "credential_hint": { "type": "string", - "description": "Empty for platform contacts and for contacts an API key added." + "nullable": true }, - "verified_at": { + "resumes_at": { "type": "string", "format": "date-time", - "nullable": true, - "description": "When this address last answered a request through its response link." + "nullable": true }, - "is_invalid": { - "type": "boolean", - "description": "true once the address bounced or complained; the EMAIL rail skips it." + "last_error": { + "type": "string", + "nullable": true + }, + "started_by": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "email": { + "type": "string", + "nullable": true + } + } + }, + "progress": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "processed": { + "type": "integer", + "format": "int64" + }, + "imported": { + "type": "integer", + "format": "int64" + }, + "updated": { + "type": "integer", + "format": "int64" + }, + "already_in_didit": { + "type": "integer", + "format": "int64" + }, + "failed": { + "type": "integer", + "format": "int64" + }, + "not_finished": { + "type": "integer", + "format": "int64" + }, + "same_person": { + "type": "integer", + "format": "int64" + } + } + }, + "face_templates": { + "type": "object", + "nullable": true, + "properties": { + "enabled": { + "type": "boolean" + }, + "built": { + "type": "integer", + "format": "int64" + }, + "duplicates": { + "type": "integer", + "format": "int64" + }, + "blocklisted": { + "type": "integer", + "format": "int64" + } + } }, - "invalid_reason": { - "type": "string", - "enum": [ - "", - "hard_bounce", - "soft_bounce", - "spam_complaint", - "suppressed" - ] + "eta_seconds": { + "type": "integer", + "nullable": true }, - "invalid_detail": { + "created_at": { "type": "string", - "description": "The receiving mail server's reason, when it gave one." + "format": "date-time" }, - "invalid_at": { + "started_at": { "type": "string", "format": "date-time", "nullable": true }, - "created_at": { + "completed_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "nullable": true } } }, - "TravelRuleCounterpartyContactCreate": { + "FiledRegulatoryReport": { "type": "object", + "description": "A finalized regulatory report that prevents the requested deletion.", "required": [ - "counterparty", - "email" + "uuid", + "report_number", + "report_type", + "case_uuid" ], "properties": { - "counterparty": { + "uuid": { "type": "string", "format": "uuid", - "description": "The directory entry's `id`." + "description": "Report UUID." }, - "email": { + "report_number": { "type": "string", - "format": "email", - "maxLength": 254 + "description": "Report number shown in the Console (for example, SAR-0001)." }, - "name": { + "report_type": { "type": "string", - "description": "Optional label.", - "maxLength": 255 + "enum": [ + "SAR", + "STR", + "CTR", + "TTR", + "UTR", + "IFT", + "CBR", + "TFR" + ], + "description": "Regulatory report type." + }, + "case_uuid": { + "type": "string", + "format": "uuid", + "description": "Case the report belongs to." } } }, - "TravelRuleNameMatch": { + "FiledReportTransaction": { "type": "object", - "nullable": true, - "description": "The name comparison that decided the transfer, or null until one ran. While the parties are masked, and on the other customer's copy of an INTERNAL exchange, `transfer_name`, `compared_name`, `matched_names` and `mismatched_names` are hidden. `score` and `matched` can disagree: `matched` follows the strictness, `score` is the similarity of the two full names.", + "description": "A transaction that cannot be deleted because a finalized regulatory report lists it.", + "required": [ + "uuid", + "transaction_id", + "reports" + ], "properties": { - "score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "description": "Similarity of the two full names, 0 to 100. 0 when either name is blank." - }, - "matched": { - "type": "boolean", - "description": "Whether the names satisfy `strictness`. The transfer's outcome follows `data_match`, which compares every field, so a transfer can be COUNTERPARTY_MISMATCHED_DATA while this is true." - }, - "method": { + "uuid": { "type": "string", - "enum": [ - "none", - "exact_token", - "token_subset", - "token_containment", - "sequence_ratio" - ], - "description": "How `matched` was decided: none (`NONE`), exact_token (`STRICT`), token_subset (`DEFAULT`), token_containment (`CONTAINS`) or sequence_ratio (`FUZZY`)." + "format": "uuid", + "description": "Didit transaction UUID." }, - "strictness": { + "transaction_id": { "type": "string", - "enum": [ - "NONE", - "STRICT", - "CONTAINS", - "DEFAULT", - "FUZZY" - ] + "description": "The transaction identifier supplied when the transaction was created." }, - "compared_with": { + "reports": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FiledRegulatoryReport" + }, + "description": "Finalized reports that list this transaction." + } + } + }, + "InFiledReportError": { + "type": "object", + "description": "The deletion is refused because the selected data is in a finalized regulatory report. Nothing is deleted. Delete the report, then repeat the request.", + "required": [ + "detail", + "code" + ], + "properties": { + "detail": { + "type": "string" + }, + "code": { "type": "string", "enum": [ - "wallet_holder", - "counterparty_vasp" + "in_filed_report" ], - "description": "wallet_holder: the holder recorded for the wallet. counterparty_vasp: the name the counterparty answered on the email response page, or the Didit Test VASP's answer in sandbox." - }, - "transfer_name": { - "type": "string", - "description": "The name on the transfer." - }, - "compared_name": { - "type": "string", - "description": "The name it was compared with." + "description": "Stable error code for a deletion blocked by a finalized regulatory report." }, - "matched_names": { + "reports": { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/FiledRegulatoryReport" }, - "description": "Words of `transfer_name` found in `compared_name`." + "description": "Reports that block a person, company, case or session deletion." }, - "mismatched_names": { + "transactions": { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/FiledReportTransaction" }, - "description": "Words of `transfer_name` missing from `compared_name`, then words of `compared_name` missing from `transfer_name`." + "description": "Transactions that block a transaction deletion, each with the reports that list it." } } }, - "TravelRuleTransferRow": { + "TravelRuleNetworkParticipantSummary": { "type": "object", - "description": "One Travel Rule transfer as the transfers list shows it: VASP names, wallets and memos only, never the originator or beneficiary person data.", + "nullable": true, + "description": "This application's own participant on the network, or null when it has none.", "properties": { - "id": { - "type": "string", - "format": "uuid", - "description": "The transfer's id." - }, - "transaction_id": { - "type": "string", - "format": "uuid", - "description": "The Didit transaction the transfer belongs to." - }, - "txn_id": { - "type": "string", - "nullable": true, - "description": "Your own id for the transaction. Transfers Didit books for you, such as a Didit Test VASP inbound transfer, carry a generated one." - }, - "txn_date": { + "mode": { "type": "string", - "format": "date-time" + "enum": [ + "platform", + "own" + ], + "description": "platform: carried by Didit's membership; own: onboarded under the application's own membership." }, - "kind": { + "status": { "type": "string", "enum": [ - "withdrawal", - "deposit", - "message" + "not_requested", + "questionnaire_pending", + "submitted_to_network", + "active", + "suspended", + "rejected" ], - "description": "withdrawal: outbound. message: an inbound transfer a rail created from a counterparty's message (a TRP inquiry, the INTERNAL inbound leg, or a GTR, VerifyVASP or Sygna Bridge message). deposit: any other inbound transfer." + "description": "not_requested: never requested, or the network refused the first request (see last_error); questionnaire_pending: waiting for the due-diligence questionnaire to be approved; submitted_to_network: handed to the network's onboarding; active: the network gave this application its own participant code; suspended / rejected: Didit suspended or rejected it." }, - "direction": { + "participant_code": { "type": "string", - "enum": [ - "INBOUND", - "OUTBOUND" - ] + "description": "The code the network gave this application (for GTR, its VASP code). Outbound messages carry this code, never Didit's own." }, - "status": { + "requested_at": { "type": "string", - "enum": [ - "AWAITING_COUNTERPARTY", - "ON_HOLD", - "COMPLETED", - "FINISHED", - "CANCELLED", - "EXPIRED", - "COUNTERPARTY_MISMATCHED_DATA", - "COUNTERPARTY_VASP_NOT_FOUND", - "COUNTERPARTY_VASP_NOT_REACHABLE", - "UNCONFIRMED_OWNERSHIP", - "COUNTERPARTY_VASP_GENERAL_DECLINE", - "NOT_ENOUGH_COUNTERPARTY_DATA", - "NOT_APPLICABLE" - ] + "format": "date-time", + "nullable": true }, - "reason": { + "activated_at": { "type": "string", - "description": "Why a `COUNTERPARTY_VASP_NOT_FOUND` or `COUNTERPARTY_VASP_NOT_REACHABLE` transfer is stuck, the same value as the transfer's own `reason`, so the list tells a bounced compliance email from a counterparty with no route without opening each transfer. `\"\"` for any other status. See [Why a transfer is stuck](/transaction-monitoring/travel-rule#why-a-transfer-is-stuck)." + "format": "date-time", + "nullable": true }, + "last_error": { + "type": "string", + "description": "The network's answer when it refused the registration; empty otherwise." + } + } + }, + "TravelRuleNetworkState": { + "type": "object", + "description": "How Travel Rule messages on one network would be sent for this application, and why they cannot be. Configuration status, not a live health or delivery check.", + "properties": { "rail": { "type": "string", - "nullable": true, "enum": [ - "INTERNAL", - "TRP", "GTR", "TRUST", "VERIFYVASP", - "SYGNA", - "EMAIL", - "TEST_VASP", - null + "SYGNA" ] }, - "asset": { - "type": "string", - "description": "The transaction's currency." - }, - "amount": { + "mode": { "type": "string", - "description": "The amount as a plain decimal, for example \"1.25\"." + "enum": [ + "own", + "didit", + "off", + "unavailable" + ], + "description": "own: the application's connected membership is used; didit: Didit's membership carries the application as its own active participant; off: platform routing disabled in disabled_networks with no own membership; unavailable: nothing can send on this network yet (see state and reason)." }, - "originator_vasp": { + "state": { "type": "string", - "description": "Outbound: your VASP's legal name. Inbound: the counterparty's name, from its directory entry, the Didit network member, the TRP sender, the Didit Test VASP, or the name the transfer declared. Empty when none is known." + "enum": [ + "own_membership", + "live_through_didit", + "off", + "didit_onboarding", + "questionnaire_needed", + "questionnaire_in_review", + "request_access", + "request_sent", + "unavailable", + "error" + ], + "description": "own_membership: your connected membership sends; live_through_didit: your own participant on Didit's membership sends; off: you switched platform routing off; didit_onboarding: Didit's own membership of this network is not live yet, so it cannot carry anyone; questionnaire_needed / questionnaire_in_review: the due-diligence questionnaire must be submitted or is with Didit; request_access: the questionnaire is approved, request the network; request_sent: your participant is being onboarded; unavailable: see reason; error: see reason." }, - "beneficiary_vasp": { + "reason": { "type": "string", - "description": "Outbound: the counterparty's name, worked out the same way. Inbound: your VASP's legal name." + "enum": [ + "own_membership_connected", + "platform_network_switched_off", + "own_membership_only", + "sandbox_application", + "didit_membership_not_live", + "participant_suspended", + "participant_rejected", + "questionnaire_not_submitted", + "questionnaire_submitted", + "questionnaire_changes_requested", + "questionnaire_rejected", + "participant_not_requested", + "participant_active", + "participant_key_missing", + "participant_key_unresolved", + "provisioning_failed", + "questionnaire_pending", + "submitted_to_network" + ], + "description": "Machine-readable detail of state. own_membership_only: Didit does not carry applications on this network (TRUST), connect your own membership; sandbox_application: sandbox transfers never reach a network; provisioning_failed: the network refused the registration, the participant's last_error says why and requesting the network again retries." }, - "originator_wallet": { - "type": "string" + "platform_available": { + "type": "boolean", + "description": "Whether Didit's own membership of this network is configured; not a live health check." }, - "beneficiary_wallet": { - "type": "string" + "connected": { + "type": "boolean", + "description": "Whether a connected customer membership exists. Credentials are validated locally; network validation occurs on a live exchange." }, - "originator_memo": { - "type": "string", - "description": "Memo or destination tag, empty on chains without one." + "participant": { + "$ref": "#/components/schemas/TravelRuleNetworkParticipantSummary" }, - "beneficiary_memo": { - "type": "string" + "vasps_reachable": { + "type": "integer", + "description": "Directory VASPs reachable on this network." }, - "originator_wallet_type": { + "routed_30d": { + "type": "integer", + "description": "This application's transfers carried on this network in the last 30 days." + } + } + }, + "TravelRuleNetworkQuestionnaireAnswers": { + "type": "object", + "description": "Didit's network due-diligence questionnaire. Saves are partial: a save keeps every answer it does not name. Submitting requires every field except lei and data_protection_contact_email, and the three attestations true.", + "properties": { + "legal_name": { "type": "string", - "enum": [ - "vasp", - "self_hosted", - "own" - ], - "description": "vasp, self_hosted (declared unhosted) or own (a wallet your address book records as yours). Your own side is always vasp." + "maxLength": 255 }, - "beneficiary_wallet_type": { + "registration_number": { "type": "string", - "enum": [ - "vasp", - "self_hosted", - "own" - ] + "maxLength": 255 }, - "matched_transaction_id": { + "incorporation_country": { "type": "string", - "format": "uuid", - "nullable": true, - "description": "The other side of a deposit you matched to an announced transfer by hand." + "minLength": 2, + "maxLength": 2, + "description": "ISO 3166-1 alpha-2 country code." }, - "deadline_at": { + "registered_address": { "type": "string", - "format": "date-time", - "nullable": true, - "description": "When the transfer expires if it is still waiting on its counterparty. Set on every transfer you create with `POST /v3/transactions/` that needs an exchange, outbound or inbound. Null below the threshold, on a Lightning payment the Travel Rule does not apply to, and on inbound transfers Didit creates when a counterparty reaches you (an inbound TRP inquiry, a network message or the INTERNAL inbound leg)." + "maxLength": 1000 }, - "created_at": { + "website": { "type": "string", - "format": "date-time" - } - } - }, - "BankAccountCheckHolder": { - "description": "The name the account is checked against. Send exactly one of `full_name` and `business_name`.", - "oneOf": [ - { - "$ref": "#/components/schemas/BankAccountCheckPersonHolder" + "format": "uri", + "maxLength": 500 }, - { - "$ref": "#/components/schemas/BankAccountCheckBusinessHolder" - } - ] - }, - "BankAccountCheckRequest": { - "type": "object", - "required": [ - "country", - "account", - "holder" - ], - "properties": { - "country": { + "lei": { "type": "string", - "minLength": 3, - "maxLength": 3, - "description": "The account's country, as an ISO 3166-1 alpha-3 code, for example `GBR`. Lowercase is accepted.", - "example": "GBR" + "maxLength": 20, + "description": "Optional. A valid ISO 17442 LEI when given." }, - "account": { - "type": "object", - "description": "The account the way its country writes it: an `iban`, or an `account_number` with the bank or branch code the country needs (`sort_code`, `routing_number`, `transit_institution`, `bsb`, `ifsc`, `bank_code` or `bic`). Mexico takes a `clabe` and Argentina a `cbu_cvu`, which already name the bank. A business account adds a `registration_id` where the country asks for one. Spaces, dashes and dots are ignored. Keys the country's check does not use are ignored; a key it needs and does not get is a `400` that names it.", - "properties": { - "iban": { - "type": "string", - "maxLength": 64, - "description": "The IBAN, in a country that uses IBANs. It must belong to `country`." - }, - "account_number": { - "type": "string", - "maxLength": 64, - "description": "The account number, in a country that writes the account with a separate bank or branch code." - }, - "sort_code": { - "type": "string", - "maxLength": 64, - "description": "United Kingdom: the 6-digit sort code." - }, - "routing_number": { - "type": "string", - "maxLength": 64, - "description": "United States: the 9-digit ABA routing number." - }, - "transit_institution": { - "type": "string", - "maxLength": 64, - "description": "Canada: the 8-digit transit and institution number." - }, - "bsb": { - "type": "string", - "maxLength": 64, - "description": "Australia: the 6-digit BSB." - }, - "ifsc": { - "type": "string", - "maxLength": 64, - "description": "India: the 11-character IFSC." - }, - "bank_code": { - "type": "string", - "maxLength": 64, - "description": "The bank's code, where the country needs one, for example in Nigeria." - }, - "bic": { - "type": "string", - "maxLength": 64, - "description": "The bank's BIC, where the country's check asks for one." - }, - "clabe": { - "type": "string", - "maxLength": 64, - "description": "Mexico: the 18-digit CLABE. It already names the bank." - }, - "cbu_cvu": { - "type": "string", - "maxLength": 64, - "description": "Argentina: the 22-digit CBU or CVU. It already names the bank." - }, - "registration_id": { - "type": "string", - "maxLength": 64, - "description": "A business account's registration number, where the country asks for one." + "licences": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": [ + "regulator", + "jurisdiction", + "licence_type", + "licence_number" + ], + "properties": { + "regulator": { + "type": "string", + "maxLength": 255 + }, + "jurisdiction": { + "type": "string", + "minLength": 2, + "maxLength": 2, + "description": "ISO 3166-1 alpha-2 country code." + }, + "licence_type": { + "type": "string", + "maxLength": 255 + }, + "licence_number": { + "type": "string", + "maxLength": 255 + } } }, - "additionalProperties": { + "description": "Every licence or registration the VASP holds." + }, + "operating_jurisdictions": { + "type": "array", + "minItems": 1, + "maxItems": 250, + "items": { "type": "string", - "maxLength": 64 - }, - "example": { - "sort_code": "20-45-67", - "account_number": "31926819" + "minLength": 2, + "maxLength": 2, + "description": "ISO 3166-1 alpha-2 country code." } }, - "holder": { - "$ref": "#/components/schemas/BankAccountCheckHolder" + "compliance_officer_name": { + "type": "string", + "maxLength": 255 + }, + "compliance_officer_email": { + "type": "string", + "format": "email" + }, + "aml_ctf_policy_attested": { + "type": "boolean", + "description": "Must be true to submit." + }, + "sanctions_screening_attested": { + "type": "boolean", + "description": "Must be true to submit." }, - "vendor_data": { + "data_protection_attested": { + "type": "boolean", + "description": "Must be true to submit." + }, + "data_protection_contact_email": { "type": "string", - "nullable": true, - "description": "Your own reference for this check, returned unchanged.", - "example": "payout_20481" + "format": "email", + "description": "Optional." + }, + "expected_monthly_transfers": { + "type": "integer", + "minimum": 0 + }, + "expected_monthly_volume_usd": { + "type": "string", + "format": "decimal", + "description": "Expected monthly volume in USD, up to 2 decimal places. Returned as a string." + }, + "assets": { + "type": "array", + "minItems": 1, + "maxItems": 200, + "items": { + "type": "string", + "maxLength": 32 + }, + "description": "Asset tickers, stored upper-case, sorted and de-duplicated." } } }, - "BankAccountCheckResponse": { + "TravelRuleNetworkQuestionnaire": { "type": "object", - "required": [ - "request_id", - "result", - "holder_name", - "account", - "vendor_data", - "created_at" - ], "properties": { - "request_id": { - "type": "string", - "format": "uuid", - "description": "The ID of this check." - }, - "result": { + "status": { "type": "string", "enum": [ - "match", - "close_match", - "no_match", - "cannot_verify" + "draft", + "submitted", + "changes_requested", + "approved", + "rejected" ], - "description": "`match`: the bank holds the account under the name you sent. `close_match`: under a close name, for example a missing middle name or a typo. `no_match`: under another name, or there is no such account. `cannot_verify`: the bank answered without comparing the name, for example for a blocked or closed account." - }, - "holder_name": { - "type": "string", - "nullable": true, - "description": "Only on a `close_match`, and only when the bank returned it: the name on the account, as the bank holds it. `null` otherwise." + "description": "Answers can be saved while draft or changes_requested; submitted, approved and rejected are Didit's to move." }, - "account": { - "type": "string", - "description": "The account, masked to its last 4 characters." + "answers": { + "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaireAnswers" }, - "vendor_data": { + "submitted_at": { "type": "string", - "nullable": true, - "description": "Your own reference, as you sent it." + "format": "date-time", + "nullable": true }, - "created_at": { + "reviewed_at": { "type": "string", "format": "date-time", - "description": "When the check ran, in UTC." - } - } - }, - "BankAccountCheckError": { - "type": "object", - "required": [ - "detail" - ], - "properties": { - "detail": { - "type": "string", - "description": "What went wrong, in English." + "nullable": true }, - "code": { + "review_note": { "type": "string", - "description": "A stable code to branch on. Absent on `401` and `403`." + "description": "Didit's note on its last decision, for example what to change." }, - "field": { - "type": "string", - "description": "`400` only: the body field to correct, as a dotted path, for example `account.sort_code`." + "history": { + "type": "array", + "readOnly": true, + "description": "Every status change, oldest first.", + "items": { + "type": "object", + "properties": { + "at": { + "type": "string", + "format": "date-time" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + }, + "note": { + "type": "string", + "description": "Review note or the network's answer, when there is one." + } + } + } }, - "reason": { + "updated_at": { "type": "string", - "enum": [ - "required", - "length", - "format", - "checksum", - "country_mismatch", - "rejected" - ], - "description": "`400` only: why the field was refused. `required`, `length`, `format`, `checksum` and `country_mismatch` (an IBAN of another country) are Didit's own checks; `rejected` means the bank refused the account as sent." + "format": "date-time", + "nullable": true } } }, - "BankVerificationResult": { + "TravelRuleNetworkParticipant": { "type": "object", - "description": "One Bank Verification step's result, for User and Business Verification. `method` says how the account was verified, and `none` that the person continued without a bank before any attempt was evaluated. `continued_without_bank` says the person continued without a bank, also after an evaluated attempt. See [Bank verification methods](/core-technology/bank-verification/verification-methods) and [When the person cannot verify their bank](/core-technology/bank-verification/fallbacks).", + "description": "This application's own participant on one network.", "properties": { - "schema_version": { - "type": "integer", - "description": "Version of this result shape. `1` today." - }, - "bank_verification_id": { - "type": "string", - "format": "uuid", - "description": "The ID of this result." - }, - "node_id": { - "type": "string", - "description": "The workflow node this result belongs to." - }, - "status": { + "network": { "type": "string", "enum": [ - "Not Finished", - "Approved", - "Declined", - "In Review", - "Expired" - ], - "description": "The step's verdict, after its actions and status rules." - }, - "original_status": { - "type": "string", - "nullable": true, - "description": "The first verdict the step reached, before any later change such as a manual review." + "gtr", + "trust", + "verifyvasp", + "sygna" + ] }, - "method": { + "rail": { "type": "string", - "nullable": true, "enum": [ - "open_banking", - "account_lookup", - "microdeposits", - "statement", - "none" - ], - "description": "How the account was verified: `open_banking` (bank sign-in: the person signed in at their bank), `account_lookup` (account check: the person typed the account details and the bank confirmed the name), `microdeposits` or `statement` (a statement upload). `none` when the person continued without a bank before any attempt was evaluated, so no account was verified. After an evaluated attempt, it stays the method of that attempt. `null` until an account is evaluated, and when the workflow narrows the data it returns. Workflow rules read the same value as `bank.method`." + "GTR", + "TRUST", + "VERIFYVASP", + "SYGNA" + ] }, - "provider": { + "mode": { "type": "string", - "nullable": true, - "description": "The key of the route that ran the connection. Read `method`, not this key, to tell how the account was verified." + "enum": [ + "platform", + "own" + ] }, - "credential_source": { + "status": { "type": "string", - "nullable": true, "enum": [ - "native", - "byok" + "not_requested", + "questionnaire_pending", + "submitted_to_network", + "active", + "suspended", + "rejected" ], - "description": "`native`: Didit's own route, billed to your Didit balance. `byok`: a marketplace provider you connected with your own credentials." + "description": "not_requested: never requested, or the network refused the first request (see last_error); questionnaire_pending: waiting for the due-diligence questionnaire to be approved; submitted_to_network: handed to the network's onboarding; active: the network gave this application its own participant code; suspended / rejected: Didit suspended or rejected it." }, - "route": { - "type": "object", - "nullable": true, - "description": "The route chosen before consent. It never changes afterwards.", - "properties": { - "provider_key": { - "type": "string", - "nullable": true, - "description": "The route's key." - }, - "credential_source": { - "type": "string", - "enum": [ - "native", - "byok" - ] - }, - "is_fallback": { - "type": "boolean", - "description": "Whether Didit's own route stood in for a marketplace provider that could not connect." - }, - "provider_connection_id": { - "type": "string", - "nullable": true, - "description": "The marketplace connection used, for `byok`." - }, - "requested_scopes": { - "type": "array", - "items": { - "type": "string" - }, - "description": "The data the connection asked for, for example `ownership` or `balances`." - } - } + "participant_code": { + "type": "string" }, - "connection": { - "type": "object", - "nullable": true, - "description": "The latest attempt's connection. `null` before the first attempt.", - "properties": { - "status": { - "type": "string", - "enum": [ - "pending", - "connected", - "cancelled", - "timeout", - "failed", - "unsupported", - "revoked", - "expired" - ] - }, - "institution_id": { - "type": "string", - "nullable": true, - "description": "The bank's ID. `null` for an account check, where no bank is picked." - }, - "institution_name": { - "type": "string", - "nullable": true, - "description": "The bank's name. `null` for an account check." - }, - "institution_country": { - "type": "string", - "nullable": true, - "description": "The account's country, ISO 3166-1 alpha-3." - }, - "oauth": { - "type": "boolean", - "nullable": true, - "description": "Whether the bank sign-in ran over OAuth or app-to-app. `null` for an account check." - }, - "connected_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "description": "When the connection succeeded." - }, - "consent_expires_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "description": "When the bank consent ends, for bank sign-in." - }, - "last_refreshed_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "description": "When the financial data was last read again." - }, - "attempts": { - "type": "integer", - "description": "The attempts the person spent on this step, every method together." - }, - "reason_code": { - "type": "string", - "nullable": true, - "description": "Why the connection is not simply `connected`, for example `USER_CANCELLED`, `INSTITUTION_DOWN`, `ACCOUNT_NOT_FOUND`, `REFERENCE_IDENTITY_MISSING` or `VERIFICATION_COMPLETED`." - } - } + "requested_at": { + "type": "string", + "format": "date-time", + "nullable": true }, - "account": { - "type": "object", - "nullable": true, - "description": "The evaluated account. `null` until an account is evaluated.", - "properties": { - "account_id_masked": { - "type": "string", - "nullable": true, - "description": "The account number, masked." - }, - "iban_masked": { - "type": "string", - "nullable": true, - "description": "The IBAN, masked." - }, - "sort_code": { - "type": "string", - "nullable": true, - "description": "The sort code, in the United Kingdom." - }, - "routing_number_masked": { - "type": "string", - "nullable": true, - "description": "The routing number, masked." - }, - "type": { - "type": "string", - "nullable": true, - "enum": [ - "checking", - "current", - "savings", - "business", - "other" - ] - }, - "subtype": { - "type": "string", - "nullable": true, - "description": "The bank's own account subtype." - }, - "currency": { - "type": "string", - "nullable": true, - "description": "ISO 4217 currency of the account." - }, - "holder_type": { - "type": "string", - "nullable": true, - "enum": [ - "person", - "business", - "unknown" - ] - }, - "holders_count": { - "type": "integer", - "nullable": true - }, - "is_joint": { - "type": "boolean", - "nullable": true - }, - "is_business": { - "type": "boolean", - "nullable": true - } - } + "submitted_at": { + "type": "string", + "format": "date-time", + "nullable": true }, - "ownership": { - "type": "object", - "nullable": true, - "description": "How the account holder compared with the verified identity. `null` until an account is evaluated.", - "properties": { - "result": { - "type": "string", - "enum": [ - "match", - "partial_match", - "no_match", - "unknown", - "not_verifiable" - ], - "description": "`partial_match` is a close match. `not_verifiable`: the bank answered with no holder to compare. `unknown`: the evidence could not be read, or there was no identity to compare." - }, - "reference_identity_source": { - "type": "string", - "nullable": true, - "description": "The step whose identity the holder was compared against: `kyc`, `database_validation`, `expected_details`, `questionnaire`, `document_ai` or `kyb`." - }, - "name_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "nullable": true, - "description": "Didit's holder name score." - }, - "provider_name_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "nullable": true, - "description": "The bank's own holder name score, when it returned one." - }, - "address_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "nullable": true, - "description": "The holder address score, when address matching ran." - }, - "email_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "nullable": true, - "description": "The holder email score, when email matching ran." - }, - "phone_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "nullable": true, - "description": "The holder phone score, when phone matching ran." - }, - "dob_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "nullable": true, - "description": "The holder date of birth score, when the bank shared one." - }, - "close_match": { - "type": "boolean", - "nullable": true, - "description": "Whether the name landed in the close-match band." - }, - "holder_confirmation": { - "type": "string", - "nullable": true, - "enum": [ - "pending", - "confirmed", - "rejected" - ], - "description": "The person's answer when asked to confirm a close-match name. `null` when never asked." - }, - "method": { - "type": "string", - "nullable": true, - "enum": [ - "exact", - "token_set", - "nickname", - "transliteration", - "fuzzy", - "provider_only", - "microdeposits" - ], - "description": "Which name comparison produced the score. This is not the verification method: read the top-level `method` for that." - }, - "matched_holder_index": { - "type": "integer", - "nullable": true - }, - "holders": { - "type": "array", - "items": { - "type": "object" - }, - "description": "Each holder the bank listed, with its scores." - }, - "owner_identity_available": { - "type": "boolean", - "nullable": true - }, - "evidence_freshness": { - "type": "string", - "nullable": true, - "enum": [ - "live", - "cached", - "refreshed" - ] - }, - "evaluated_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "description": "When the verdict was computed." - } - } + "activated_at": { + "type": "string", + "format": "date-time", + "nullable": true }, - "financial_data": { - "type": "object", - "description": "The financial data the step read. Only bank sign-in reads it.", - "properties": { - "balances": { - "type": "object", - "nullable": true, - "description": "With the `balances` scope." - }, - "transactions": { - "type": "object", - "nullable": true, - "description": "With the `transactions` scope." - }, - "income": { - "type": "object", - "nullable": true, - "description": "With the `income` scope." - }, - "categorization": { - "type": "object", - "nullable": true, - "description": "Didit's categorization of the transactions read. `null` without them." - }, - "not_collected": { - "type": "array", - "items": { + "suspended_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "last_error": { + "type": "string", + "description": "The network's answer when it refused the registration; empty otherwise." + }, + "history": { + "type": "array", + "readOnly": true, + "description": "Every status change, oldest first.", + "items": { + "type": "object", + "properties": { + "at": { "type": "string", - "enum": [ - "balances", - "income", - "transactions" - ] + "format": "date-time" }, - "description": "The data the step asked for that the method which verified the account does not collect. Balances, transactions and income come from bank sign-in only, so an account verified by account check lists them here. Never a failure. Empty otherwise." + "from": { + "type": "string" + }, + "to": { + "type": "string" + }, + "note": { + "type": "string", + "description": "Review note or the network's answer, when there is one." + } } } + } + } + }, + "TravelRuleNetworksOverview": { + "type": "object", + "properties": { + "platform_networks_enabled": { + "type": "boolean", + "description": "Whether network access through Didit's membership is open. While false, questionnaire saves, submissions and network requests answer 403." }, - "billing": { + "questionnaire": { + "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaire" + }, + "participants": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TravelRuleNetworkParticipant" + } + }, + "networks": { "type": "object", - "nullable": true, + "readOnly": true, + "description": "Per network, how this application would send and why it cannot. No network, including GTR, is included by default: a network is reachable through your own connected membership, or through Didit's membership once Didit's membership of that network is live and your own participant on it is active. Not a live health or delivery check.", "properties": { - "route": { - "type": "string", - "enum": [ - "native", - "byok" - ] + "gtr": { + "$ref": "#/components/schemas/TravelRuleNetworkState" }, - "billed": { - "type": "boolean" + "trust": { + "$ref": "#/components/schemas/TravelRuleNetworkState" }, - "marketplace_fee": { - "type": "string", - "nullable": true, - "description": "The marketplace platform fee charged, for `byok`." + "verifyvasp": { + "$ref": "#/components/schemas/TravelRuleNetworkState" }, - "usage_type": { - "type": "string", - "nullable": true, - "description": "The usage line the charge was booked on: `bank_verification` for a bank sign-in or an account check, `bank_statement_upload` for a statement upload with no charged bank attempt before it, and `bank_byok_fee` for the marketplace fee on your own provider. `null` when nothing was billed." + "sygna": { + "$ref": "#/components/schemas/TravelRuleNetworkState" } } + } + } + }, + "AddressValidationResult": { + "type": "object", + "description": "The result of one Address Validation: whether the address exists, and its normalised form. It confirms the address only; it never links the address to a person.", + "required": [ + "status", + "verification_level", + "address", + "formatted_address", + "latitude", + "longitude" + ], + "properties": { + "status": { + "type": "string", + "enum": [ + "verified", + "partially_verified", + "not_verified", + "unavailable" + ], + "description": "`verified`: the address was confirmed down to the building (or the flat or PO box). `partially_verified`: it was confirmed only to the street, or to the most precise level the postal reference data holds for that place. `not_verified`: only the region or the city matched, or nothing did. `unavailable`: the validation could not run (for example the reference service did not answer); it is not charged and never affects a verification." }, - "reference_identity": { - "type": "object", - "nullable": true, - "description": "The identity the holder was compared against, with its source." - }, - "signals": { - "type": "object", - "nullable": true, - "description": "Account signals read from the transaction history, when the step read one." - }, - "connection_abandoned": { - "type": "boolean", - "nullable": true, - "description": "Whether the step ended without a match after the person left at their bank." - }, - "not_covered": { - "type": "boolean", + "verification_level": { + "type": "string", "nullable": true, - "description": "Whether the person's bank or country could not be reached on this step. Also `true` when the person continued without a bank because no method could verify their country or bank." - }, - "continued_without_bank": { - "type": "boolean", - "description": "Whether the person left the step with **Continue without your bank**. `continuation` then says why. `method` is `none` when no attempt was evaluated before they continued. After an evaluated attempt, such as a holder that does not match, `method` stays the method of that attempt and its verdict and reason codes stand. Returned even when the workflow narrows the data it returns." + "enum": [ + "administrative_area", + "locality", + "thoroughfare", + "premise", + "delivery_point", + null + ], + "description": "The most precise level the address was matched to. `null` when nothing matched or `status` is `unavailable`." }, - "continuation": { + "address": { "type": "object", "nullable": true, - "description": "How the person continued without a bank. `null` when they did not. When the workflow narrows the data it returns, `reason` is still returned and every other key is `null`.", + "description": "The normalised address. `null` when `status` is `unavailable`.", "properties": { - "reason": { + "address_line_1": { "type": "string", - "enum": [ - "no_route", - "institution_unsupported", - "attempts_exhausted", - "person_choice" - ], - "description": "Why, as Didit worked it out when the person continued: `no_route` (no bank sign-in or account check serves their country), `institution_unsupported` (the bank they picked cannot be used on this step), `attempts_exhausted` (every attempt was already spent and none was in progress), or `person_choice` (a way to verify was there and they chose to continue, also when their bank could not be reached right now). `no_route` and `institution_unsupported` follow `bank_unsupported_action`, `attempts_exhausted` follows `bank_attempts_exhausted_action`, and `person_choice` follows `bank_skipped_action`, unless an evaluated attempt already decided the step." + "nullable": true, + "description": "First delivery line, written the way the country writes it.", + "example": "1600 Amphitheatre Pkwy" }, - "country": { + "address_line_2": { "type": "string", "nullable": true, - "description": "The country the person was verifying in, ISO 3166-1 alpha-3. `null` when they continued before picking one." + "description": "Second delivery line (a flat, building or neighbourhood), when the address has one." }, - "offered": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "statement", - "microdeposits" - ] - }, + "city": { + "type": "string", "nullable": true, - "description": "The other ways to verify that country offered the person when they continued, in the order it offered them: `statement` (a statement upload), then `microdeposits`. Empty when it offered none." + "example": "Mountain View" }, - "institution_id": { + "region": { "type": "string", "nullable": true, - "description": "For `institution_unsupported`, the ID of the bank the person could not use: the bank they picked, or the bank their last attempt ended on. Didit takes it from its own list of banks, never from the person's device, so a bank that list does not have is `null`. `null` for every other reason." + "description": "State, province or region.", + "example": "CA" }, - "institution_name": { + "postal_code": { "type": "string", "nullable": true, - "description": "For `institution_unsupported`, the name of that bank, from the same list as `institution_id`. `null` when that list does not have the bank, and for every other reason." + "example": "94043-1351" }, - "continued_at": { + "country": { "type": "string", - "format": "date-time", "nullable": true, - "description": "When the person continued." + "description": "ISO 3166-1 alpha-2 country code.", + "example": "US" } } }, - "evidence_purged_at": { + "formatted_address": { "type": "string", - "format": "date-time", "nullable": true, - "description": "When the bank evidence was deleted under `bank_evidence_retention_days`. `null` otherwise." - }, - "warnings": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Informational codes, for example `holder_declared`. A warning never changes the status on its own." - }, - "reason_codes": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Why the verdict came out the way it did, for example `OWNER_NAME_PARTIAL`. Several may apply. `NOT_COVERED`: the person continued without a bank because no method could verify their country or bank. `SKIPPED`: the person chose to continue without a bank while a way to verify was there. Neither is added when an evaluated attempt already decided the step." + "description": "The normalised address on one line.", + "example": "1600 Amphitheatre Pkwy, Mountain View CA 94043-1351" }, - "created_at": { - "type": "string", - "format": "date-time" + "latitude": { + "type": "number", + "nullable": true, + "example": 37.422022 }, - "updated_at": { - "type": "string", - "format": "date-time" + "longitude": { + "type": "number", + "nullable": true, + "example": -122.08429 } } }, - "BankAccountCheckPersonHolder": { + "AddressValidationRequest": { "type": "object", - "description": "The person who should hold the account.", "required": [ - "full_name" + "country" ], + "description": "One address: on one line (`address`) or as structured fields with at least `address_line_1`, never both.", "properties": { - "full_name": { + "address": { + "type": "string", + "maxLength": 500, + "description": "The whole address on one line.", + "example": "Paseo de la Castellana 259, 28046 Madrid" + }, + "address_line_1": { "type": "string", "maxLength": 255, - "description": "The full name of the person who should hold the account.", - "example": "Maria Oliveira" - } - } - }, - "BankAccountCheckBusinessHolder": { - "type": "object", - "description": "The company that should hold the account. Checks a business account.", - "required": [ - "business_name" - ], - "properties": { - "business_name": { + "description": "Street and number.", + "example": "1600 Amphitheatre Pkwy" + }, + "address_line_2": { "type": "string", "maxLength": 255, - "description": "The name of the company that should hold the account. Checks a business account." - } - } - }, - "BankVerificationPricing": { - "type": "object", - "description": "Public Bank Verification list prices: the statement upload, the own provider key fee and each country's methods.", - "required": [ - "currency", - "statement_upload", - "own_provider_fee_usd", - "countries" - ], - "properties": { - "currency": { + "description": "Apartment, suite, floor or building." + }, + "city": { "type": "string", - "enum": [ - "USD" - ], - "description": "Currency of every price in the response.", - "example": "USD" + "maxLength": 128, + "description": "City or locality.", + "example": "Mountain View" }, - "statement_upload": { - "$ref": "#/components/schemas/BankStatementUploadPricing" + "region": { + "type": "string", + "maxLength": 128, + "description": "State, province or region.", + "example": "CA" }, - "own_provider_fee_usd": { + "postal_code": { "type": "string", - "description": "Fee for each billable ownership check on a route that uses your own provider contract instead of Didit's, charged whatever the result. A cancelled, timed out or abandoned connection is not billed. Decimal string with 4 decimals, in USD.", - "example": "0.0200" + "maxLength": 32, + "example": "94043" }, - "countries": { - "type": "object", - "description": "Every country, keyed by ISO 3166-1 alpha-3 code.", - "additionalProperties": { - "$ref": "#/components/schemas/BankVerificationPricingCountry" - } + "country": { + "type": "string", + "maxLength": 3, + "description": "ISO 3166-1 alpha-2 or alpha-3 code of the address's country.", + "example": "US" } } }, - "BankStatementUploadPricing": { + "AddressValidationResponse": { "type": "object", - "description": "How the bank statement upload is priced.", "required": [ - "price_usd", - "included_after_charged_bank_attempt", - "standalone_available" + "request_id", + "address_validation", + "created_at" ], "properties": { - "price_usd": { + "request_id": { "type": "string", - "description": "Price of a statement upload after a charged bank attempt. Decimal string with 4 decimals, in USD.", - "example": "0.0000" + "format": "uuid", + "description": "Identifier of this request; quote it to support. No session is created." }, - "included_after_charged_bank_attempt": { - "type": "boolean", - "description": "`true` when the upload is included at no extra charge after a charged bank attempt in the same session.", - "example": true + "address_validation": { + "$ref": "#/components/schemas/AddressValidationResult" }, - "standalone_available": { - "type": "boolean", - "description": "`true` when a statement upload can run on its own, with no bank attempt first. `false` in production; sandbox sessions can test it without billing.", - "example": false - } - } - }, - "BankVerificationPricingCountry": { - "type": "object", - "description": "One country's Bank Verification methods and their list prices.", - "required": [ - "name", - "methods" - ], - "properties": { - "name": { + "created_at": { "type": "string", - "description": "Country name in English.", - "example": "United Kingdom" - }, - "methods": { - "$ref": "#/components/schemas/BankVerificationPricingMethods" + "format": "date-time" } } }, - "BankVerificationPricingMethods": { - "type": "object", - "description": "The two Bank Verification methods in a country.", - "required": [ - "open_banking", - "account_lookup" + "TravelRuleWalletProofFailureReason": { + "type": "string", + "enum": [ + "", + "SIGNATURE_INVALID", + "SIGNATURE_UNSUPPORTED_SCHEME", + "DEPOSIT_NOT_FOUND", + "DEPOSIT_UNCONFIRMED", + "DEPOSIT_LOOKUP_FAILED", + "DEPOSIT_MISMATCH", + "DEPOSIT_STALE", + "TXID_REUSED", + "CHAIN_UNSUPPORTED", + "WINDOW_EXPIRED", + "OWNERSHIP_CHANGED", + "METHOD_SWITCHED", + "REVIEW_REJECTED", + "ABANDONED" ], - "properties": { - "open_banking": { - "$ref": "#/components/schemas/BankSignInPricing" - }, - "account_lookup": { - "$ref": "#/components/schemas/BankAccountCheckPricing" - } - } + "description": "Why a wallet-ownership proof, or its last attempt, fell short of VERIFIED. Empty when nothing failed. A PENDING proof can carry one: the last attempt failed and the end user can try again. DEPOSIT_MISMATCH, DEPOSIT_STALE, TXID_REUSED and REVIEW_REJECTED close the proof as REJECTED. SIGNATURE_INVALID: the signature does not match the wallet and challenge. SIGNATURE_UNSUPPORTED_SCHEME: the wallet signed in a format Didit does not verify. DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED, DEPOSIT_LOOKUP_FAILED: the test deposit is not readable or not confirmed yet; Didit keeps checking it until the test window closes. DEPOSIT_MISMATCH: the transaction does not send the expected amount from the wallet to the deposit address. DEPOSIT_STALE: the transaction predates the challenge. TXID_REUSED: the transaction already proved another wallet. CHAIN_UNSUPPORTED: the method is not available on this chain. WINDOW_EXPIRED: the test window closed. OWNERSHIP_CHANGED: the wallet's holder changed, or the wallet was deleted from your address book, after the widget session was minted. METHOD_SWITCHED: the end user picked another method before finishing this one. REVIEW_REJECTED: your reviewer rejected the screenshot. ABANDONED: the widget session lapsed before the end user finished." }, - "BankSignInPricing": { + "TravelRuleWidgetProofError": { "type": "object", - "description": "Bank sign-in: the person signs in to their bank. Priced by market, the same for every bank in it.", - "required": [ - "available", - "market", - "price_usd", - "add_ons" - ], "properties": { - "available": { - "type": "boolean", - "description": "`true` only where Didit serves bank sign-in in this country in production.", - "example": true + "detail": { + "type": "string", + "description": "Human-readable message in English." }, - "market": { + "code": { + "allOf": [ + { + "$ref": "#/components/schemas/TravelRuleWalletProofFailureReason" + } + ], + "description": "Machine-readable reason, so a client can show its own translated message." + }, + "status": { "type": "string", - "nullable": true, - "description": "The market whose price applies. `null` when not available.", - "example": "UK and EEA" + "enum": [ + "PENDING", + "VERIFIED", + "REJECTED", + "EXPIRED" + ], + "description": "Present when the proof is closed: REJECTED by the deposit just submitted (400), or REJECTED or EXPIRED when evidence is sent to a proof that is already closed (409)." }, - "price_usd": { + "proof_id": { "type": "string", - "nullable": true, - "description": "List price of one bank sign-in. `null` when not available. Decimal string with 4 decimals, in USD.", - "example": "0.7900" + "format": "uuid", + "description": "Present with status: the closed proof." }, - "add_ons": { - "type": "object", - "description": "Add-ons priced in this country, each a decimal string with 4 decimals in USD, added to the bank sign-in price. Only the add-ons the country offers are listed; empty when bank sign-in is not available.", - "properties": { - "balance": { - "type": "string", - "description": "Account balance add-on.", - "example": "0.3500" - }, - "transactions": { - "type": "string", - "description": "Transactions add-on.", - "example": "1.3000" - } - } + "method": { + "type": "string", + "enum": [ + "MESSAGE_SIGNING", + "SATOSHI_TEST", + "SCREENSHOT", + "SELF_DECLARATION" + ], + "description": "Present with status: the closed proof's method." + }, + "max_attempts": { + "type": "integer", + "description": "Present with status: rejected wallet proofs this session allows." + }, + "attempts_used": { + "type": "integer", + "description": "Present with status: rejected proofs so far." + }, + "attempts_remaining": { + "type": "integer", + "description": "Present with status: when 0, starting another proof answers 409 and you mint a new widget session." } } }, - "BankAccountCheckPricing": { + "TravelRuleWidgetProofCreate": { "type": "object", - "description": "Account check: the person types their account number and Didit checks it with the bank. Priced per country.", "required": [ - "available", - "price_usd" + "method" ], "properties": { - "available": { - "type": "boolean", - "description": "`true` only where Didit serves the account check in this country in production.", - "example": true + "method": { + "type": "string", + "enum": [ + "MESSAGE_SIGNING", + "SATOSHI_TEST", + "SCREENSHOT", + "SELF_DECLARATION" + ], + "description": "The proof method the end user picked. It must be one of the context's allowed_methods." + }, + "wallet_address": { + "type": "string", + "maxLength": 128, + "description": "Defaults to the session's wallet_address. Must match the transfer's wallet when the session is linked to a transfer." }, - "price_usd": { + "chain": { "type": "string", - "nullable": true, - "description": "List price of one account check the bank answers. `null` when not available. Decimal string with 4 decimals, in USD.", - "example": "0.4000" + "maxLength": 32, + "description": "Defaults to the session's chain." } } }, - "ImportProvider": { + "TravelRuleWidgetProofVerifyResult": { "type": "object", "properties": { - "key": { + "proof_id": { + "type": "string", + "format": "uuid" + }, + "method": { "type": "string", "enum": [ - "sumsub", - "jumio", - "veriff", - "onfido", - "persona", - "metamap", - "socure", - "idnow", - "shufti", - "idenfy", - "ondato", - "trulioo", - "au10tix", - "complycube", - "other" + "MESSAGE_SIGNING", + "SATOSHI_TEST", + "SCREENSHOT", + "SELF_DECLARATION" ] }, - "name": { - "type": "string" - }, - "mode": { + "status": { "type": "string", "enum": [ - "api_list", - "api_ids", - "export_file" - ], - "description": "`api_list`: Didit lists records with the key. `api_ids`: upload the record IDs from an export. `export_file`: upload an export in Didit's format." - }, - "record_noun": { - "type": "string" - }, - "credential_fields": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "label": { - "type": "string" - }, - "secret": { - "type": "boolean" - } - } - } + "PENDING", + "VERIFIED", + "REJECTED", + "EXPIRED" + ] }, - "regions": { - "type": "array", - "items": { - "type": "string" - } + "is_ownership_verified": { + "type": "boolean", + "description": "Present when the proof is VERIFIED: the address book entry is now ownership-verified." }, - "required_permissions": { - "type": "array", - "items": { - "type": "string" - } + "transfer_status": { + "type": "string", + "nullable": true, + "description": "Present when the proof is VERIFIED: the linked transfer's status, null without one." }, - "docs_url": { + "detail": { "type": "string", - "nullable": true + "description": "Present while the proof stays PENDING: a submitted screenshot awaiting review, or a test deposit that is not confirmed yet." }, - "status_mapping": { - "type": "object", - "additionalProperties": { - "type": "string", - "enum": [ - "Approved", - "Declined", - "In Review", - "Expired", - "Not Finished", - "Abandoned" - ] - } + "code": { + "allOf": [ + { + "$ref": "#/components/schemas/TravelRuleWalletProofFailureReason" + } + ], + "description": "Present on a pending test deposit: why it is not confirmed yet." } } }, - "ImportJobSummary": { + "TravelRuleWalletProofReview": { "type": "object", - "description": "One import job of any kind, in the shape the console's Import jobs drawer reads.", "properties": { - "id": { + "proof_id": { "type": "string", "format": "uuid" }, - "kind": { + "method": { "type": "string", "enum": [ - "sessions", - "businesses", - "users", - "status_rules", - "transactions" + "SCREENSHOT" ] }, - "source": { + "status": { "type": "string", "enum": [ - "file", - "api", - "provider" + "PENDING", + "VERIFIED", + "REJECTED", + "EXPIRED" ] }, - "provider": { - "type": "string", - "nullable": true - }, - "provider_name": { - "type": "string", - "nullable": true - }, - "filename": { - "type": "string", - "nullable": true + "wallet_address": { + "type": "string" }, - "state": { + "chain": { "type": "string", - "enum": [ - "ready", - "queued", - "running", - "paused", - "completed", - "errors", - "failed", - "cancelled" - ], - "description": "The job's state as the console shows it; `errors` is a completed job with rejected rows." + "description": "Canonical chain identifier, e.g. ETH, BTC, SOL, TRX." }, - "status": { + "holder_name": { "type": "string" }, - "is_dry_run": { - "type": "boolean" + "is_ownership_verified": { + "type": "boolean", + "description": "Whether the address book entry is ownership-verified, by this proof or another one." }, - "credential_hint": { + "transaction_id": { "type": "string", - "nullable": true + "format": "uuid", + "nullable": true, + "description": "The transaction whose Travel Rule transfer the widget session was minted for. Null for a session minted without a transaction_id." }, - "resumes_at": { + "file_name": { "type": "string", - "format": "date-time", "nullable": true }, - "last_error": { + "content_type": { "type": "string", "nullable": true }, - "started_by": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true - }, - "email": { - "type": "string", - "nullable": true - } - } - }, - "progress": { - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64" - }, - "processed": { - "type": "integer", - "format": "int64" - }, - "imported": { - "type": "integer", - "format": "int64" - }, - "updated": { - "type": "integer", - "format": "int64" - }, - "already_in_didit": { - "type": "integer", - "format": "int64" - }, - "failed": { - "type": "integer", - "format": "int64" - }, - "not_finished": { - "type": "integer", - "format": "int64" - }, - "same_person": { - "type": "integer", - "format": "int64" - } - } - }, - "face_templates": { - "type": "object", + "screenshot_url": { + "type": "string", "nullable": true, - "properties": { - "enabled": { - "type": "boolean" - }, - "built": { - "type": "integer", - "format": "int64" - }, - "duplicates": { - "type": "integer", - "format": "int64" - }, - "blocklisted": { - "type": "integer", - "format": "int64" - } - } + "description": "Time-limited link to the uploaded screenshot. List the queue again for a fresh link." }, - "eta_seconds": { + "attempts": { "type": "integer", - "nullable": true + "description": "How many files the end user uploaded for this proof." }, - "created_at": { - "type": "string", - "format": "date-time" + "failure_reason": { + "allOf": [ + { + "$ref": "#/components/schemas/TravelRuleWalletProofFailureReason" + } + ], + "description": "REVIEW_REJECTED after a rejection, OWNERSHIP_CHANGED when the wallet changed holder or was deleted before a decision. Empty otherwise." }, - "started_at": { + "method_chosen_at": { "type": "string", "format": "date-time", - "nullable": true + "nullable": true, + "description": "When the end user picked the screenshot method." }, - "completed_at": { + "decided_at": { "type": "string", "format": "date-time", "nullable": true - } - } - }, - "FiledRegulatoryReport": { - "type": "object", - "description": "A finalized regulatory report that prevents the requested deletion.", - "required": [ - "uuid", - "report_number", - "report_type", - "case_uuid" - ], - "properties": { - "uuid": { - "type": "string", - "format": "uuid", - "description": "Report UUID." }, - "report_number": { + "decided_by": { "type": "string", - "description": "Report number shown in the Console (for example, SAR-0001)." + "description": "Who closed the proof: review: for a console reviewer, review for an API-key decision, widget or sweeper when Didit closed it automatically. Empty while PENDING." }, - "report_type": { + "review_note": { "type": "string", - "enum": [ - "SAR", - "STR", - "CTR", - "TTR", - "UTR", - "IFT", - "CBR", - "TFR" - ], - "description": "Regulatory report type." + "description": "The note sent with the decision. Empty when none." }, - "case_uuid": { + "created_at": { "type": "string", - "format": "uuid", - "description": "Case the report belongs to." + "format": "date-time" } } }, - "FiledReportTransaction": { + "TravelRuleWalletProofDecision": { "type": "object", - "description": "A transaction that cannot be deleted because a finalized regulatory report lists it.", "required": [ - "uuid", - "transaction_id", - "reports" + "decision" ], "properties": { - "uuid": { + "decision": { "type": "string", - "format": "uuid", - "description": "Didit transaction UUID." + "enum": [ + "approve", + "reject" + ] }, - "transaction_id": { + "note": { "type": "string", - "description": "The transaction identifier supplied when the transaction was created." - }, - "reports": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FiledRegulatoryReport" - }, - "description": "Finalized reports that list this transaction." + "maxLength": 512, + "description": "Optional. Kept with the proof and returned as review_note." } } }, - "InFiledReportError": { + "DigitalIdWalletApiWalletDigitalCredentialsRequest": { "type": "object", - "description": "The deletion is refused because the selected data is in a finalized regulatory report. Nothing is deleted. Delete the report, then repeat the request.", - "required": [ - "detail", - "code" - ], "properties": { - "detail": { - "type": "string" - }, - "code": { + "protocol": { "type": "string", - "enum": [ - "in_filed_report" - ], - "description": "Stable error code for a deletion blocked by a finalized regulatory report." + "description": "openid4vp-v1-signed." }, - "reports": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FiledRegulatoryReport" - }, - "description": "Reports that block a person, company, case or session deletion." - }, - "transactions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FiledReportTransaction" - }, - "description": "Transactions that block a transaction deletion, each with the reports that list it." + "request": { + "type": "object", + "additionalProperties": {}, + "description": "Pass as is: navigator.credentials.get({digital: request}) in the browser, or JSON.stringify(request) as GetDigitalCredentialOption's requestJson on Android. Signed by Didit for your application." } - } + }, + "required": [ + "protocol", + "request" + ] }, - "TravelRuleNetworkParticipantSummary": { + "DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest": { "type": "object", - "nullable": true, - "description": "This application's own participant on the network, or null when it has none.", + "description": "Start a Google Wallet verification (USA, GBR, BRA, SGP, TWN).", "properties": { - "mode": { - "type": "string", - "enum": [ - "platform", - "own" - ], - "description": "platform: carried by Didit's membership; own: onboarded under the application's own membership." - }, - "status": { + "vendor_data": { "type": "string", - "enum": [ - "not_requested", - "questionnaire_pending", - "submitted_to_network", - "active", - "suspended", - "rejected" - ], - "description": "not_requested: never requested, or the network refused the first request (see last_error); questionnaire_pending: waiting for the due-diligence questionnaire to be approved; submitted_to_network: handed to the network's onboarding; active: the network gave this application its own participant code; suspended / rejected: Didit suspended or rejected it." + "nullable": true, + "description": "Your own reference for this verification (e.g. your user id). Returned in results and webhooks." }, - "participant_code": { - "type": "string", - "description": "The code the network gave this application (for GTR, its VASP code). Outbound messages carry this code, never Didit's own." + "metadata": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "description": "Optional JSON object stored with the verification and returned in results and webhooks." }, - "requested_at": { + "sandbox_scenario": { "type": "string", - "format": "date-time", - "nullable": true + "minLength": 1, + "description": "Sandbox applications only: the simulated outcome - 'wallet_cancelled', 'wallet_timeout' or 'wallet_provider_error'; any other scenario (or none) verifies. Rejected on live applications. The full catalog is available at GET /v1/sandbox/scenarios/." }, - "activated_at": { - "type": "string", - "format": "date-time", - "nullable": true + "country": { + "allOf": [ + { + "$ref": "#/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartCountryEnum" + } + ], + "description": "ISO 3166-1 alpha-3 country of the Google Wallet identity.\n\n* `USA` - USA\n* `GBR` - GBR\n* `BRA` - BRA\n* `SGP` - SGP\n* `TWN` - TWN" }, - "last_error": { + "origin": { "type": "string", - "description": "The network's answer when it refused the registration; empty otherwise." + "minLength": 1, + "description": "Where your page or app will ask the wallet: the https origin of your page (its host must be in the application's allowed_return_hosts, or be its white-label domain), e.g. https://app.example.com, or android:apk-key-hash:. The wallet refuses the request anywhere else.", + "maxLength": 256 } - } + }, + "required": [ + "country", + "origin" + ] }, - "TravelRuleNetworkState": { + "DigitalIdWalletApiGoogleWalletWalletVerificationStartCountryEnum": { + "enum": [ + "USA", + "GBR", + "BRA", + "SGP", + "TWN" + ], + "type": "string", + "description": "* `USA` - USA\n* `GBR` - GBR\n* `BRA` - BRA\n* `SGP` - SGP\n* `TWN` - TWN" + }, + "DigitalIdWalletApiWalletDigitalCredentialResponseRequest": { "type": "object", - "description": "How Travel Rule messages on one network would be sent for this application, and why they cannot be. Configuration status, not a live health or delivery check.", + "description": "What the wallet answered your page or app, for a ``request_digital_credential`` verification.", "properties": { - "rail": { - "type": "string", - "enum": [ - "GTR", - "TRUST", - "VERIFYVASP", - "SYGNA" - ] - }, - "mode": { - "type": "string", - "enum": [ - "own", - "didit", - "off", - "unavailable" - ], - "description": "own: the application's connected membership is used; didit: Didit's membership carries the application as its own active participant; off: platform routing disabled in disabled_networks with no own membership; unavailable: nothing can send on this network yet (see state and reason)." - }, - "state": { - "type": "string", - "enum": [ - "own_membership", - "live_through_didit", - "off", - "didit_onboarding", - "questionnaire_needed", - "questionnaire_in_review", - "request_access", - "request_sent", - "unavailable", - "error" - ], - "description": "own_membership: your connected membership sends; live_through_didit: your own participant on Didit's membership sends; off: you switched platform routing off; didit_onboarding: Didit's own membership of this network is not live yet, so it cannot carry anyone; questionnaire_needed / questionnaire_in_review: the due-diligence questionnaire must be submitted or is with Didit; request_access: the questionnaire is approved, request the network; request_sent: your participant is being onboarded; unavailable: see reason; error: see reason." - }, - "reason": { + "response": { + "type": "object", + "additionalProperties": {}, + "description": "Exactly what the wallet returned: {protocol, data} of the DigitalCredential from navigator.credentials.get, or the parsed credentialJson of Android's DigitalCredential. Encrypted to Didit; do not alter it." + } + }, + "required": [ + "response" + ] + }, + "SessionFilesExport": { + "type": "object", + "description": "One ZIP with every file of a session, in original quality.", + "required": [ + "export_id", + "session_id", + "status", + "file_count", + "size_bytes", + "download_url", + "expires_at", + "error", + "created_at", + "completed_at" + ], + "properties": { + "export_id": { "type": "string", - "enum": [ - "own_membership_connected", - "platform_network_switched_off", - "own_membership_only", - "sandbox_application", - "didit_membership_not_live", - "participant_suspended", - "participant_rejected", - "questionnaire_not_submitted", - "questionnaire_submitted", - "questionnaire_changes_requested", - "questionnaire_rejected", - "participant_not_requested", - "participant_active", - "participant_key_missing", - "participant_key_unresolved", - "provisioning_failed", - "questionnaire_pending", - "submitted_to_network" - ], - "description": "Machine-readable detail of state. own_membership_only: Didit does not carry applications on this network (TRUST), connect your own membership; sandbox_application: sandbox transfers never reach a network; provisioning_failed: the network refused the registration, the participant's last_error says why and requesting the network again retries." - }, - "platform_available": { - "type": "boolean", - "description": "Whether Didit's own membership of this network is configured; not a live health check." + "format": "uuid", + "description": "ID of the export. Pass it to `GET /v3/session/{sessionId}/files-export/{exportId}/`." }, - "connected": { - "type": "boolean", - "description": "Whether a connected customer membership exists. Credentials are validated locally; network validation occurs on a live exchange." + "session_id": { + "type": "string", + "format": "uuid", + "description": "The session the files are from." }, - "participant": { - "$ref": "#/components/schemas/TravelRuleNetworkParticipantSummary" + "status": { + "type": "string", + "enum": [ + "PENDING", + "PROCESSING", + "READY", + "FAILED", + "EXPIRED" + ], + "description": "`PENDING` and `PROCESSING` while the ZIP is prepared, `READY` once it can be downloaded, `FAILED` when it could not be prepared (request a new export), `EXPIRED` once the ZIP was deleted." }, - "vasps_reachable": { + "file_count": { "type": "integer", - "description": "Directory VASPs reachable on this network." + "nullable": true, + "description": "Files in the ZIP. Set only while `status` is `READY`." }, - "routed_30d": { + "size_bytes": { "type": "integer", - "description": "This application's transfers carried on this network in the last 30 days." - } - } - }, - "TravelRuleNetworkQuestionnaireAnswers": { - "type": "object", - "description": "Didit's network due-diligence questionnaire. Saves are partial: a save keeps every answer it does not name. Submitting requires every field except lei and data_protection_contact_email, and the three attestations true.", - "properties": { - "legal_name": { - "type": "string", - "maxLength": 255 + "format": "int64", + "nullable": true, + "description": "Size of the ZIP in bytes. Set only while `status` is `READY`." }, - "registration_number": { + "download_url": { "type": "string", - "maxLength": 255 + "format": "uri", + "nullable": true, + "description": "Signed URL of the ZIP, valid for a short time. Set only while `status` is `READY`; read the export again for a new one." }, - "incorporation_country": { + "expires_at": { "type": "string", - "minLength": 2, - "maxLength": 2, - "description": "ISO 3166-1 alpha-2 country code." + "format": "date-time", + "nullable": true, + "description": "When the ZIP is deleted, 24 hours after it was ready. Set only while `status` is `READY`." }, - "registered_address": { + "error": { "type": "string", - "maxLength": 1000 + "nullable": true, + "description": "Why the export failed, when `status` is `FAILED`." }, - "website": { + "created_at": { "type": "string", - "format": "uri", - "maxLength": 500 + "format": "date-time", + "description": "When the export was requested." }, - "lei": { + "completed_at": { "type": "string", - "maxLength": 20, - "description": "Optional. A valid ISO 17442 LEI when given." + "format": "date-time", + "nullable": true, + "description": "When the ZIP was ready or the export failed." + } + } + }, + "TransactionRuleSuggestionsCreatedEvent": { + "description": "A transaction rule suggestion run proposed new rule changes for your application. Sent when the rule-suggestion settings have webhook notifications on. There is no top-level `status`.", + "allOf": [ + { + "$ref": "#/components/schemas/WebhookEventEnvelope" }, - "licences": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": [ - "regulator", - "jurisdiction", - "licence_type", - "licence_number" - ], - "properties": { - "regulator": { - "type": "string", - "maxLength": 255 - }, - "jurisdiction": { - "type": "string", - "minLength": 2, - "maxLength": 2, - "description": "ISO 3166-1 alpha-2 country code." - }, - "licence_type": { - "type": "string", - "maxLength": 255 - }, - "licence_number": { - "type": "string", - "maxLength": 255 + { + "type": "object", + "properties": { + "webhook_type": { + "type": "string", + "enum": [ + "transaction_rule_suggestions.created" + ], + "description": "Always `transaction_rule_suggestions.created`." + }, + "run_id": { + "type": "string", + "format": "uuid", + "description": "The suggestion run that produced the new suggestions." + }, + "open_count": { + "type": "integer", + "description": "Number of suggestions that are still open after this run, new ones included." + }, + "suggestions": { + "type": "array", + "description": "The suggestions this run created.", + "items": { + "type": "object", + "required": [ + "suggestion_id", + "kind", + "title", + "rule_id", + "expected_impact" + ], + "properties": { + "suggestion_id": { + "type": "string", + "format": "uuid" + }, + "kind": { + "type": "string", + "enum": [ + "ADD", + "TWEAK", + "DISABLE" + ], + "description": "`ADD` proposes a new rule, `TWEAK` changes an existing one, `DISABLE` turns one off." + }, + "title": { + "type": "string" + }, + "rule_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The rule a `TWEAK` or `DISABLE` suggestion applies to; `null` for `ADD`." + }, + "expected_impact": { + "type": "object", + "additionalProperties": true, + "description": "What the change would do, as the suggestion shows it in the Console." + } + } } } }, - "description": "Every licence or registration the VASP holds." + "required": [ + "webhook_type", + "run_id", + "open_count", + "suggestions" + ] + } + ] + }, + "GeolocationCheck": { + "type": "object", + "description": "One Location verification result, the accepted attempt of one workflow node. Measurement, uncertainty and authenticity are separate keys, so a precise unattested fix reads differently from an imprecise attested one.", + "properties": { + "node_id": { + "type": "string", + "nullable": true, + "description": "Workflow node that produced this result, so a workflow with two Location verification steps stays readable." }, - "operating_jurisdictions": { - "type": "array", - "minItems": 1, - "maxItems": 250, - "items": { - "type": "string", - "minLength": 2, - "maxLength": 2, - "description": "ISO 3166-1 alpha-2 country code." - } + "status": { + "type": "string", + "enum": [ + "Not Finished", + "Approved", + "Declined", + "In Review", + "Resub Requested" + ], + "description": "Feature-level status of this Location verification step, resolved from its warnings. Independent of the session `status`." }, - "compliance_officer_name": { + "outcome": { "type": "string", - "maxLength": 255 + "nullable": true, + "description": "What happened on this attempt.", + "enum": [ + "verified", + "low_accuracy", + "accuracy_undetermined", + "stale", + "approximate", + "denied", + "restricted", + "unavailable", + "timeout", + "mock_detected", + "outside_geofence", + "in_blocked_area", + "anonymizer_detected", + "skipped", + "replay_rejected", + "unsupported_client", + null + ] }, - "compliance_officer_email": { + "permission": { "type": "string", - "format": "email" + "nullable": true, + "description": "What the operating system or browser granted. `not_requested` means the step uses the connection's IP location only, so the person is never asked for a permission.", + "enum": [ + "granted_precise", + "granted_approximate", + "denied", + "restricted", + "unavailable", + "timeout", + "dismissed", + "not_requested", + null + ] }, - "aml_ctf_policy_attested": { - "type": "boolean", - "description": "Must be true to submit." + "latitude": { + "type": "number", + "nullable": true, + "description": "WGS84 latitude of the fix. `null` when there is no fix.", + "format": "double" }, - "sanctions_screening_attested": { - "type": "boolean", - "description": "Must be true to submit." + "longitude": { + "type": "number", + "nullable": true, + "description": "WGS84 longitude of the fix. `null` when there is no fix.", + "format": "double" }, - "data_protection_attested": { - "type": "boolean", - "description": "Must be true to submit." + "accuracy_m": { + "type": "number", + "nullable": true, + "description": "Radius of uncertainty in metres, at the confidence level in `accuracy_confidence`.", + "format": "double" }, - "data_protection_contact_email": { + "accuracy_confidence": { "type": "string", - "format": "email", - "description": "Optional." + "nullable": true, + "description": "Confidence level the platform attaches to `accuracy_m`: `p95` (browsers), `p68` (Android) or `unspecified` (iOS).", + "enum": [ + "p95", + "p68", + "unspecified", + null + ] }, - "expected_monthly_transfers": { + "measured_at": { + "type": "string", + "nullable": true, + "description": "When the device took the fix, by its own clock.", + "format": "date-time" + }, + "age_seconds": { "type": "integer", - "minimum": 0 + "nullable": true, + "description": "Seconds between the device taking the fix and Didit receiving it." }, - "expected_monthly_volume_usd": { + "source": { "type": "string", - "format": "decimal", - "description": "Expected monthly volume in USD, up to 2 decimal places. Returned as a string." + "nullable": true, + "description": "Where the fix came from, when the platform says. `ip` means the position is the connection's IP location.", + "enum": [ + "gps", + "fused", + "network", + "wifi", + "cell", + "browser", + "unknown", + "ip", + null + ] }, - "assets": { - "type": "array", - "minItems": 1, - "maxItems": 200, - "items": { - "type": "string", - "maxLength": 32 - }, - "description": "Asset tickers, stored upper-case, sorted and de-duplicated." - } - } - }, - "TravelRuleNetworkQuestionnaire": { - "type": "object", - "properties": { - "status": { + "platform": { "type": "string", + "nullable": true, + "description": "The client that produced the fix.", "enum": [ - "draft", - "submitted", - "changes_requested", - "approved", - "rejected" - ], - "description": "Answers can be saved while draft or changes_requested; submitted, approved and rejected are Didit's to move." + "web", + "ios", + "android", + "react_native", + "flutter", + null + ] }, - "answers": { - "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaireAnswers" + "sdk_version": { + "type": "string", + "nullable": true, + "description": "Version of the SDK that produced the fix." }, - "submitted_at": { + "is_mock": { + "type": "boolean", + "nullable": true, + "description": "`true` when the device says the fix came from a mock location provider or simulation software. `null` when the platform does not report it (browsers cannot tell); `null` is not `false`." + }, + "produced_by_accessory": { + "type": "boolean", + "nullable": true, + "description": "iOS only: `true` when the fix came from an external accessory. `null` elsewhere." + }, + "integrity": { "type": "string", - "format": "date-time", - "nullable": true + "enum": [ + "attested", + "not_attested", + "failed", + "unsupported", + "not_determined" + ], + "description": "Whether device attestation backs the fix. `unsupported` is what browsers report, because the web has no attestation mechanism; it is not a failure." }, - "reviewed_at": { + "country_code": { "type": "string", - "format": "date-time", - "nullable": true + "nullable": true, + "description": "ISO 3166-1 alpha-2 country the fix is in." }, - "review_note": { + "region_code": { "type": "string", - "description": "Didit's note on its last decision, for example what to change." + "nullable": true, + "description": "ISO 3166-2 subdivision the fix is in." }, - "history": { - "type": "array", - "readOnly": true, - "description": "Every status change, oldest first.", - "items": { - "type": "object", - "properties": { - "at": { - "type": "string", - "format": "date-time" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - }, - "note": { - "type": "string", - "description": "Review note or the network's answer, when there is one." - } + "city": { + "type": "string", + "nullable": true, + "description": "Nearest populated place, a label for reviewers." + }, + "geofence": { + "type": "object", + "description": "Result of the country and area rules of the step.", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether the step applies any country or area rule." + }, + "result": { + "type": "string", + "nullable": true, + "description": "Where the position sits relative to the rules. `undetermined` means the accuracy circle straddles the border or the position resolved to no country; it is not evidence of being outside.", + "enum": [ + "inside", + "outside", + "undetermined", + null + ] } } }, - "updated_at": { - "type": "string", - "format": "date-time", - "nullable": true - } - } - }, - "TravelRuleNetworkParticipant": { - "type": "object", - "description": "This application's own participant on one network.", - "properties": { - "network": { - "type": "string", - "enum": [ - "gtr", - "trust", - "verifyvasp", - "sygna" - ] + "inside_geofence": { + "type": "boolean", + "nullable": true, + "description": "`true` when `geofence.result` is `inside`, `false` when `outside`, `null` otherwise." }, - "rail": { + "geofence_basis": { "type": "string", + "nullable": true, + "description": "Which position the area result was judged from: the `device` fix, or the connection's `ip` location.", "enum": [ - "GTR", - "TRUST", - "VERIFYVASP", - "SYGNA" + "device", + "ip", + null ] }, - "mode": { + "inside_areas": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Ids of the configured allowed areas the position is inside." + }, + "blocked_areas": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Ids of the configured blocked areas the position is in." + }, + "position_source": { "type": "string", + "nullable": true, + "description": "Where the step takes the position from, as configured: the device checked against the IP location, the device only, or the IP location only.", "enum": [ - "platform", - "own" + "device_and_ip", + "device_only", + "ip_only", + null ] }, - "status": { - "type": "string", - "enum": [ - "not_requested", - "questionnaire_pending", - "submitted_to_network", - "active", - "suspended", - "rejected" - ], - "description": "not_requested: never requested, or the network refused the first request (see last_error); questionnaire_pending: waiting for the due-diligence questionnaire to be approved; submitted_to_network: handed to the network's onboarding; active: the network gave this application its own participant code; suspended / rejected: Didit suspended or rejected it." + "anonymizers": { + "type": "object", + "nullable": true, + "description": "What the connection and device look like, each `true`, `false` or `null` when the source cannot tell.", + "properties": { + "vpn": { + "type": "boolean", + "nullable": true + }, + "proxy": { + "type": "boolean", + "nullable": true + }, + "tor": { + "type": "boolean", + "nullable": true + }, + "spoofing": { + "type": "boolean", + "nullable": true + }, + "emulator": { + "type": "boolean", + "nullable": true + } + } }, - "participant_code": { - "type": "string" + "ip_distance_km": { + "type": "number", + "nullable": true, + "description": "Distance to the session's IP location after both uncertainty radii are subtracted; `0` when they overlap.", + "format": "double" }, - "requested_at": { - "type": "string", - "format": "date-time", - "nullable": true + "ip_distance_uncertainty_km": { + "type": "number", + "nullable": true, + "description": "Combined radius that was subtracted: the IP location's radius plus this fix's accuracy.", + "format": "double" }, - "submitted_at": { - "type": "string", - "format": "date-time", - "nullable": true + "ip_consistent": { + "type": "boolean", + "nullable": true, + "description": "Whether `ip_distance_km` is within the distance configured on the step. `null` when either side is unknown." }, - "activated_at": { - "type": "string", - "format": "date-time", - "nullable": true + "document_distance_km": { + "type": "number", + "nullable": true, + "description": "Distance to the geocoded address on the ID document or proof of address. `null` when no address is on file.", + "format": "double" }, - "suspended_at": { - "type": "string", - "format": "date-time", - "nullable": true + "travel_excused": { + "type": "boolean", + "nullable": true, + "description": "Whether the step's travel tolerance excused the distance from the address. `null` when tolerance is off." }, - "last_error": { - "type": "string", - "description": "The network's answer when it refused the registration; empty otherwise." + "consecutive_mismatches": { + "type": "integer", + "nullable": true, + "description": "On the final attempt: this check plus the same person's earlier mismatches in a row." }, - "history": { + "attempts": { + "type": "integer", + "description": "Number of this attempt within the node, starting at 1." + }, + "consent": { + "type": "object", + "nullable": true, + "description": "The consent the person gave before the system prompt, recorded with the wording version and language they saw.", + "properties": { + "accepted_at": { + "type": "string", + "format": "date-time" + }, + "version": { + "type": "string", + "nullable": true + }, + "locale": { + "type": "string", + "nullable": true + } + } + }, + "warnings": { "type": "array", - "readOnly": true, - "description": "Every status change, oldest first.", "items": { "type": "object", "properties": { - "at": { + "feature": { "type": "string", - "format": "date-time" + "enum": [ + "ID_VERIFICATION", + "NFC", + "LIVENESS", + "FACEMATCH", + "PROOF_OF_ADDRESS", + "PHONE", + "EMAIL", + "AML", + "LOCATION", + "DATABASE_VALIDATION", + "QUESTIONNAIRE", + "DOCUMENT_AI", + "KYB_REGISTRY", + "KYB_DOCUMENTS", + "KYB_KEY_PEOPLE", + "GEOLOCATION", + "SIGNATURE" + ], + "description": "The feature that generated this warning. The value identifies the feature block the warning belongs to. Each module's warnings array typically uses the value matching its module (e.g. `PHONE` inside `phone_verifications[].warnings`), but the enum above is authoritative across all feature warnings on the decision payload." }, - "from": { + "risk": { "type": "string" }, - "to": { + "additional_data": { + "type": "object", + "nullable": true + }, + "log_type": { "type": "string" }, - "note": { + "short_description": { + "type": "string" + }, + "long_description": { + "type": "string" + }, + "node_id": { "type": "string", - "description": "Review note or the network's answer, when there is one." + "description": "The workflow graph node ID that generated this warning" } } - } - } - } - }, - "TravelRuleNetworksOverview": { - "type": "object", - "properties": { - "platform_networks_enabled": { - "type": "boolean", - "description": "Whether network access through Didit's membership is open. While false, questionnaire saves, submissions and network requests answer 403." - }, - "questionnaire": { - "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaire" - }, - "participants": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TravelRuleNetworkParticipant" - } - }, - "networks": { - "type": "object", - "readOnly": true, - "description": "Per network, how this application would send and why it cannot. No network, including GTR, is included by default: a network is reachable through your own connected membership, or through Didit's membership once Didit's membership of that network is live and your own participant on it is active. Not a live health or delivery check.", - "properties": { - "gtr": { - "$ref": "#/components/schemas/TravelRuleNetworkState" - }, - "trust": { - "$ref": "#/components/schemas/TravelRuleNetworkState" - }, - "verifyvasp": { - "$ref": "#/components/schemas/TravelRuleNetworkState" - }, - "sygna": { - "$ref": "#/components/schemas/TravelRuleNetworkState" - } - } + }, + "description": "Warnings this Location verification step raised, with `feature` set to `GEOLOCATION`. Warning codes start with `LOCATION_`." } } }, - "AddressValidationResult": { + "GeolocationAttempt": { "type": "object", - "description": "The result of one Address Validation: whether the address exists, and its normalised form. It confirms the address only; it never links the address to a person.", - "required": [ - "status", - "verification_level", - "address", - "formatted_address", - "latitude", - "longitude" - ], + "description": "One attempt of a Location verification step: the same keys as `geolocation_checks[]` except `warnings`, plus when Didit received it.", "properties": { + "node_id": { + "type": "string", + "nullable": true, + "description": "Workflow node that produced this result, so a workflow with two Location verification steps stays readable." + }, "status": { "type": "string", "enum": [ - "verified", - "partially_verified", - "not_verified", - "unavailable" + "Not Finished", + "Approved", + "Declined", + "In Review", + "Resub Requested" ], - "description": "`verified`: the address was confirmed down to the building (or the flat or PO box). `partially_verified`: it was confirmed only to the street, or to the most precise level the postal reference data holds for that place. `not_verified`: only the region or the city matched, or nothing did. `unavailable`: the validation could not run (for example the reference service did not answer); it is not charged and never affects a verification." + "description": "Feature-level status of this Location verification step, resolved from its warnings. Independent of the session `status`." }, - "verification_level": { + "outcome": { "type": "string", "nullable": true, + "description": "What happened on this attempt.", "enum": [ - "administrative_area", - "locality", - "thoroughfare", - "premise", - "delivery_point", + "verified", + "low_accuracy", + "accuracy_undetermined", + "stale", + "approximate", + "denied", + "restricted", + "unavailable", + "timeout", + "mock_detected", + "outside_geofence", + "in_blocked_area", + "anonymizer_detected", + "skipped", + "replay_rejected", + "unsupported_client", null - ], - "description": "The most precise level the address was matched to. `null` when nothing matched or `status` is `unavailable`." - }, - "address": { - "type": "object", - "nullable": true, - "description": "The normalised address. `null` when `status` is `unavailable`.", - "properties": { - "address_line_1": { - "type": "string", - "nullable": true, - "description": "First delivery line, written the way the country writes it.", - "example": "1600 Amphitheatre Pkwy" - }, - "address_line_2": { - "type": "string", - "nullable": true, - "description": "Second delivery line (a flat, building or neighbourhood), when the address has one." - }, - "city": { - "type": "string", - "nullable": true, - "example": "Mountain View" - }, - "region": { - "type": "string", - "nullable": true, - "description": "State, province or region.", - "example": "CA" - }, - "postal_code": { - "type": "string", - "nullable": true, - "example": "94043-1351" - }, - "country": { - "type": "string", - "nullable": true, - "description": "ISO 3166-1 alpha-2 country code.", - "example": "US" - } - } + ] }, - "formatted_address": { + "permission": { "type": "string", "nullable": true, - "description": "The normalised address on one line.", - "example": "1600 Amphitheatre Pkwy, Mountain View CA 94043-1351" + "description": "What the operating system or browser granted. `not_requested` means the step uses the connection's IP location only, so the person is never asked for a permission.", + "enum": [ + "granted_precise", + "granted_approximate", + "denied", + "restricted", + "unavailable", + "timeout", + "dismissed", + "not_requested", + null + ] }, "latitude": { "type": "number", "nullable": true, - "example": 37.422022 + "description": "WGS84 latitude of the fix. `null` when there is no fix.", + "format": "double" }, "longitude": { "type": "number", "nullable": true, - "example": -122.08429 - } - } - }, - "AddressValidationRequest": { - "type": "object", - "required": [ - "country" - ], - "description": "One address: on one line (`address`) or as structured fields with at least `address_line_1`, never both.", - "properties": { - "address": { - "type": "string", - "maxLength": 500, - "description": "The whole address on one line.", - "example": "Paseo de la Castellana 259, 28046 Madrid" - }, - "address_line_1": { - "type": "string", - "maxLength": 255, - "description": "Street and number.", - "example": "1600 Amphitheatre Pkwy" - }, - "address_line_2": { - "type": "string", - "maxLength": 255, - "description": "Apartment, suite, floor or building." + "description": "WGS84 longitude of the fix. `null` when there is no fix.", + "format": "double" }, - "city": { - "type": "string", - "maxLength": 128, - "description": "City or locality.", - "example": "Mountain View" - }, - "region": { - "type": "string", - "maxLength": 128, - "description": "State, province or region.", - "example": "CA" - }, - "postal_code": { - "type": "string", - "maxLength": 32, - "example": "94043" + "accuracy_m": { + "type": "number", + "nullable": true, + "description": "Radius of uncertainty in metres, at the confidence level in `accuracy_confidence`.", + "format": "double" }, - "country": { - "type": "string", - "maxLength": 3, - "description": "ISO 3166-1 alpha-2 or alpha-3 code of the address's country.", - "example": "US" - } - } - }, - "AddressValidationResponse": { - "type": "object", - "required": [ - "request_id", - "address_validation", - "created_at" - ], - "properties": { - "request_id": { + "accuracy_confidence": { "type": "string", - "format": "uuid", - "description": "Identifier of this request; quote it to support. No session is created." - }, - "address_validation": { - "$ref": "#/components/schemas/AddressValidationResult" + "nullable": true, + "description": "Confidence level the platform attaches to `accuracy_m`: `p95` (browsers), `p68` (Android) or `unspecified` (iOS).", + "enum": [ + "p95", + "p68", + "unspecified", + null + ] }, - "created_at": { + "measured_at": { "type": "string", + "nullable": true, + "description": "When the device took the fix, by its own clock.", "format": "date-time" - } - } - }, - "TravelRuleWalletProofFailureReason": { - "type": "string", - "enum": [ - "", - "SIGNATURE_INVALID", - "SIGNATURE_UNSUPPORTED_SCHEME", - "DEPOSIT_NOT_FOUND", - "DEPOSIT_UNCONFIRMED", - "DEPOSIT_LOOKUP_FAILED", - "DEPOSIT_MISMATCH", - "DEPOSIT_STALE", - "TXID_REUSED", - "CHAIN_UNSUPPORTED", - "WINDOW_EXPIRED", - "OWNERSHIP_CHANGED", - "METHOD_SWITCHED", - "REVIEW_REJECTED", - "ABANDONED" - ], - "description": "Why a wallet-ownership proof, or its last attempt, fell short of VERIFIED. Empty when nothing failed. A PENDING proof can carry one: the last attempt failed and the end user can try again. DEPOSIT_MISMATCH, DEPOSIT_STALE, TXID_REUSED and REVIEW_REJECTED close the proof as REJECTED. SIGNATURE_INVALID: the signature does not match the wallet and challenge. SIGNATURE_UNSUPPORTED_SCHEME: the wallet signed in a format Didit does not verify. DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED, DEPOSIT_LOOKUP_FAILED: the test deposit is not readable or not confirmed yet; Didit keeps checking it until the test window closes. DEPOSIT_MISMATCH: the transaction does not send the expected amount from the wallet to the deposit address. DEPOSIT_STALE: the transaction predates the challenge. TXID_REUSED: the transaction already proved another wallet. CHAIN_UNSUPPORTED: the method is not available on this chain. WINDOW_EXPIRED: the test window closed. OWNERSHIP_CHANGED: the wallet's holder changed, or the wallet was deleted from your address book, after the widget session was minted. METHOD_SWITCHED: the end user picked another method before finishing this one. REVIEW_REJECTED: your reviewer rejected the screenshot. ABANDONED: the widget session lapsed before the end user finished." - }, - "TravelRuleWidgetProofError": { - "type": "object", - "properties": { - "detail": { - "type": "string", - "description": "Human-readable message in English." }, - "code": { - "allOf": [ - { - "$ref": "#/components/schemas/TravelRuleWalletProofFailureReason" - } - ], - "description": "Machine-readable reason, so a client can show its own translated message." + "age_seconds": { + "type": "integer", + "nullable": true, + "description": "Seconds between the device taking the fix and Didit receiving it." }, - "status": { + "source": { "type": "string", + "nullable": true, + "description": "Where the fix came from, when the platform says. `ip` means the position is the connection's IP location.", "enum": [ - "PENDING", - "VERIFIED", - "REJECTED", - "EXPIRED" - ], - "description": "Present when the proof is closed: REJECTED by the deposit just submitted (400), or REJECTED or EXPIRED when evidence is sent to a proof that is already closed (409)." + "gps", + "fused", + "network", + "wifi", + "cell", + "browser", + "unknown", + "ip", + null + ] }, - "proof_id": { + "platform": { "type": "string", - "format": "uuid", - "description": "Present with status: the closed proof." + "nullable": true, + "description": "The client that produced the fix.", + "enum": [ + "web", + "ios", + "android", + "react_native", + "flutter", + null + ] }, - "method": { + "sdk_version": { "type": "string", - "enum": [ - "MESSAGE_SIGNING", - "SATOSHI_TEST", - "SCREENSHOT", - "SELF_DECLARATION" - ], - "description": "Present with status: the closed proof's method." + "nullable": true, + "description": "Version of the SDK that produced the fix." }, - "max_attempts": { - "type": "integer", - "description": "Present with status: rejected wallet proofs this session allows." + "is_mock": { + "type": "boolean", + "nullable": true, + "description": "`true` when the device says the fix came from a mock location provider or simulation software. `null` when the platform does not report it (browsers cannot tell); `null` is not `false`." }, - "attempts_used": { - "type": "integer", - "description": "Present with status: rejected proofs so far." + "produced_by_accessory": { + "type": "boolean", + "nullable": true, + "description": "iOS only: `true` when the fix came from an external accessory. `null` elsewhere." }, - "attempts_remaining": { - "type": "integer", - "description": "Present with status: when 0, starting another proof answers 409 and you mint a new widget session." - } - } - }, - "TravelRuleWidgetProofCreate": { - "type": "object", - "required": [ - "method" - ], - "properties": { - "method": { + "integrity": { "type": "string", "enum": [ - "MESSAGE_SIGNING", - "SATOSHI_TEST", - "SCREENSHOT", - "SELF_DECLARATION" + "attested", + "not_attested", + "failed", + "unsupported", + "not_determined" ], - "description": "The proof method the end user picked. It must be one of the context's allowed_methods." + "description": "Whether device attestation backs the fix. `unsupported` is what browsers report, because the web has no attestation mechanism; it is not a failure." }, - "wallet_address": { + "country_code": { "type": "string", - "maxLength": 128, - "description": "Defaults to the session's wallet_address. Must match the transfer's wallet when the session is linked to a transfer." + "nullable": true, + "description": "ISO 3166-1 alpha-2 country the fix is in." }, - "chain": { - "type": "string", - "maxLength": 32, - "description": "Defaults to the session's chain." - } - } - }, - "TravelRuleWidgetProofVerifyResult": { - "type": "object", - "properties": { - "proof_id": { + "region_code": { "type": "string", - "format": "uuid" + "nullable": true, + "description": "ISO 3166-2 subdivision the fix is in." }, - "method": { + "city": { "type": "string", - "enum": [ - "MESSAGE_SIGNING", - "SATOSHI_TEST", - "SCREENSHOT", - "SELF_DECLARATION" - ] + "nullable": true, + "description": "Nearest populated place, a label for reviewers." }, - "status": { - "type": "string", - "enum": [ - "PENDING", - "VERIFIED", - "REJECTED", - "EXPIRED" - ] + "geofence": { + "type": "object", + "description": "Result of the country and area rules of the step.", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether the step applies any country or area rule." + }, + "result": { + "type": "string", + "nullable": true, + "description": "Where the position sits relative to the rules. `undetermined` means the accuracy circle straddles the border or the position resolved to no country; it is not evidence of being outside.", + "enum": [ + "inside", + "outside", + "undetermined", + null + ] + } + } }, - "is_ownership_verified": { + "inside_geofence": { "type": "boolean", - "description": "Present when the proof is VERIFIED: the address book entry is now ownership-verified." - }, - "transfer_status": { - "type": "string", "nullable": true, - "description": "Present when the proof is VERIFIED: the linked transfer's status, null without one." - }, - "detail": { - "type": "string", - "description": "Present while the proof stays PENDING: a submitted screenshot awaiting review, or a test deposit that is not confirmed yet." - }, - "code": { - "allOf": [ - { - "$ref": "#/components/schemas/TravelRuleWalletProofFailureReason" - } - ], - "description": "Present on a pending test deposit: why it is not confirmed yet." - } - } - }, - "TravelRuleWalletProofReview": { - "type": "object", - "properties": { - "proof_id": { - "type": "string", - "format": "uuid" + "description": "`true` when `geofence.result` is `inside`, `false` when `outside`, `null` otherwise." }, - "method": { + "geofence_basis": { "type": "string", + "nullable": true, + "description": "Which position the area result was judged from: the `device` fix, or the connection's `ip` location.", "enum": [ - "SCREENSHOT" + "device", + "ip", + null ] }, - "status": { + "inside_areas": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Ids of the configured allowed areas the position is inside." + }, + "blocked_areas": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Ids of the configured blocked areas the position is in." + }, + "position_source": { "type": "string", + "nullable": true, + "description": "Where the step takes the position from, as configured: the device checked against the IP location, the device only, or the IP location only.", "enum": [ - "PENDING", - "VERIFIED", - "REJECTED", - "EXPIRED" + "device_and_ip", + "device_only", + "ip_only", + null ] }, - "wallet_address": { - "type": "string" + "anonymizers": { + "type": "object", + "nullable": true, + "description": "What the connection and device look like, each `true`, `false` or `null` when the source cannot tell.", + "properties": { + "vpn": { + "type": "boolean", + "nullable": true + }, + "proxy": { + "type": "boolean", + "nullable": true + }, + "tor": { + "type": "boolean", + "nullable": true + }, + "spoofing": { + "type": "boolean", + "nullable": true + }, + "emulator": { + "type": "boolean", + "nullable": true + } + } }, - "chain": { - "type": "string", - "description": "Canonical chain identifier, e.g. ETH, BTC, SOL, TRX." + "ip_distance_km": { + "type": "number", + "nullable": true, + "description": "Distance to the session's IP location after both uncertainty radii are subtracted; `0` when they overlap.", + "format": "double" }, - "holder_name": { - "type": "string" + "ip_distance_uncertainty_km": { + "type": "number", + "nullable": true, + "description": "Combined radius that was subtracted: the IP location's radius plus this fix's accuracy.", + "format": "double" }, - "is_ownership_verified": { + "ip_consistent": { "type": "boolean", - "description": "Whether the address book entry is ownership-verified, by this proof or another one." - }, - "transaction_id": { - "type": "string", - "format": "uuid", "nullable": true, - "description": "The transaction whose Travel Rule transfer the widget session was minted for. Null for a session minted without a transaction_id." + "description": "Whether `ip_distance_km` is within the distance configured on the step. `null` when either side is unknown." }, - "file_name": { - "type": "string", - "nullable": true + "document_distance_km": { + "type": "number", + "nullable": true, + "description": "Distance to the geocoded address on the ID document or proof of address. `null` when no address is on file.", + "format": "double" }, - "content_type": { - "type": "string", - "nullable": true + "travel_excused": { + "type": "boolean", + "nullable": true, + "description": "Whether the step's travel tolerance excused the distance from the address. `null` when tolerance is off." }, - "screenshot_url": { - "type": "string", + "consecutive_mismatches": { + "type": "integer", "nullable": true, - "description": "Time-limited link to the uploaded screenshot. List the queue again for a fresh link." + "description": "On the final attempt: this check plus the same person's earlier mismatches in a row." }, "attempts": { "type": "integer", - "description": "How many files the end user uploaded for this proof." + "description": "Number of this attempt within the node, starting at 1." }, - "failure_reason": { - "allOf": [ - { - "$ref": "#/components/schemas/TravelRuleWalletProofFailureReason" + "consent": { + "type": "object", + "nullable": true, + "description": "The consent the person gave before the system prompt, recorded with the wording version and language they saw.", + "properties": { + "accepted_at": { + "type": "string", + "format": "date-time" + }, + "version": { + "type": "string", + "nullable": true + }, + "locale": { + "type": "string", + "nullable": true } - ], - "description": "REVIEW_REJECTED after a rejection, OWNERSHIP_CHANGED when the wallet changed holder or was deleted before a decision. Empty otherwise." + } }, - "method_chosen_at": { + "received_at": { "type": "string", - "format": "date-time", "nullable": true, - "description": "When the end user picked the screenshot method." - }, - "decided_at": { - "type": "string", - "format": "date-time", - "nullable": true - }, - "decided_by": { - "type": "string", - "description": "Who closed the proof: review: for a console reviewer, review for an API-key decision, widget or sweeper when Didit closed it automatically. Empty while PENDING." - }, - "review_note": { - "type": "string", - "description": "The note sent with the decision. Empty when none." + "description": "When Didit received the attempt.", + "format": "date-time" }, "created_at": { "type": "string", @@ -108859,23 +127257,54 @@ } } }, - "TravelRuleWalletProofDecision": { + "BiometricRetention": { "type": "object", + "description": "When the live biometric data of this session is deleted.", "required": [ - "decision" + "jurisdictions", + "deletes_at" ], "properties": { - "decision": { - "type": "string", - "enum": [ - "approve", - "reject" - ] + "jurisdictions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Codes of the US states whose biometric rules set a deletion limit for this person (`US` when the state is unknown). Empty when none applies." }, - "note": { + "deletes_at": { "type": "string", - "maxLength": 512, - "description": "Optional. Kept with the proof and returned as review_note." + "format": "date-time", + "nullable": true, + "description": "The date the live biometric data (face images and templates) of this session is deleted, from your application's retention setting and, where one applies, the legal limit for the person's jurisdiction. `null` when no date applies yet." + } + } + }, + "TravelRuleManualMatchRequest": { + "type": "object", + "required": [ + "transaction_id" + ], + "properties": { + "transaction_id": { + "type": "string", + "format": "uuid", + "description": "The `transaction_id` of the received Travel Rule message (a row with `kind: message`)." + } + } + }, + "TravelRuleManualMatchResponse": { + "type": "object", + "required": [ + "deposit", + "message" + ], + "properties": { + "deposit": { + "$ref": "#/components/schemas/TravelRuleTransferRow" + }, + "message": { + "$ref": "#/components/schemas/TravelRuleTransferRow" } } } @@ -108885,7 +127314,7 @@ "type": "apiKey", "in": "header", "name": "x-api-key", - "description": "Your application's API key, from Developers -> API keys in the Business Console. The primary key has full access. A named key can be scoped: none, read or write per resource, limited to some workflows or to approved sessions, to a list of IP addresses, and to an expiry date. 401 means the key is missing, wrong, revoked or expired; 403 means the key has no access to this resource or action, or the request came from an address outside its IP list; 404 on a session route means the session is outside the key's workflows or statuses. A key without media access receives image, video and PDF URLs as null, and a key without sessions write receives session links and tokens as null. See https://docs.didit.me/console/api-keys." + "description": "Your application's API key, from Developers -> API keys in the Business Console. The primary key has full access. A named key can be scoped: none, read or write per resource, limited to some workflows or to approved sessions, to a list of IP addresses, and to an expiry date. 401 means the key is wrong, revoked or expired; 403 means no key was sent, the key has no access to this resource or action, or the request came from an address outside its IP list; 404 on a session route means the session is outside the key's workflows or statuses. A key without media access receives image, video and PDF URLs as null, and a key without sessions write receives session links and tokens as null. See https://docs.didit.me/console/api-keys." }, "TransactionTokenAuth": { "type": "apiKey", @@ -109601,6 +128030,44 @@ } } } + }, + "transaction_rule_suggestions.created": { + "post": { + "summary": "Transaction rule suggestions created", + "description": "A transaction rule suggestion run proposed new rule changes for your application. Sent when the rule-suggestion settings have webhook notifications on. There is no top-level `status`.", + "tags": [ + "Webhook" + ], + "parameters": [ + { + "$ref": "#/components/parameters/WebhookSignature" + }, + { + "$ref": "#/components/parameters/WebhookSignatureV2" + }, + { + "$ref": "#/components/parameters/WebhookSignatureSimple" + }, + { + "$ref": "#/components/parameters/WebhookTimestamp" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransactionRuleSuggestionsCreatedEvent" + } + } + } + }, + "responses": { + "2XX": { + "description": "Any 2xx response acknowledges the delivery. Other responses and timeouts are retried; see https://docs.didit.me/integration/webhooks." + } + } + } } } } diff --git a/sig/didit/resources/analytics.rbs b/sig/didit/resources/analytics.rbs index 5058b26..3d4e91e 100644 --- a/sig/didit/resources/analytics.rbs +++ b/sig/didit/resources/analytics.rbs @@ -4,6 +4,7 @@ module Didit module Resources class Analytics < Didit::Resource def retrieve: (?start_date: Date | String, ?end_date: Date | String, ?scope: String, ?widget_keys: String, ?workflow_ids: String, ?versions: String, ?branch_path_ids: String, ?tag: String, ?transaction_type: String, ?action_type: String, ?request_options: Didit::request_options?) -> Didit::Types::AnalyticsRetrieveResponse + def retrieve_today: (?tz: String, ?request_options: Didit::request_options?) -> Didit::Types::ApplicationAnalyticsToday end end end diff --git a/sig/didit/resources/database_validation.rbs b/sig/didit/resources/database_validation.rbs index cbce2e8..ec8ba65 100644 --- a/sig/didit/resources/database_validation.rbs +++ b/sig/didit/resources/database_validation.rbs @@ -3,7 +3,7 @@ module Didit module Resources class DatabaseValidation < Didit::Resource - def validate: (issuing_state: String, ?services: Array[String], ?validation_type: String, ?consent: bool, ?identification_number: String, ?first_name: String, ?last_name: String, ?middle_name: String, ?full_name: String, ?date_of_birth: Date | String, ?personal_number: String, ?tax_number: String, ?document_number: String, ?document_type: String, ?expiration_date: Date | String, ?date_of_issue: Date | String, ?nationality: String, ?gender: String, ?address: (Didit::Types::database_validation_validate_params_address_variant1 | String), ?address_element_1: String, ?address_element_2: String, ?address_element_3: String, ?address_element_4: String, ?address_element_5: String, ?postal_code: String, ?driver_license_number: String, ?driver_license_card_number: String, ?driver_license_state: String, ?driver_license_version: String, ?passport_number: String, ?passport_expiration_date: Date | String, ?passport_file_number: String, ?passport_issue_country: String, ?medicare_card_number: String, ?immi_card_number: String, ?immi_card_expiry_date: Date | String, ?citizenship_certificate_number: String, ?birth_registration_number: String, ?birth_registration_date: Date | String, ?birth_registration_state: String, ?marriage_certificate_number: String, ?change_of_name_certificate_number: String, ?first_partner_name: String, ?last_partner_name: String, ?voter_id: String, ?epic_card: String, ?pan: String, ?national_id: String, ?cic: String, ?identificador_ciudadano: String, ?ocr: String, ?voter_number: String, ?emission_number: String, ?bvn: String, ?bank_card_number: String, ?ssn: String, ?phone: String, ?landline: String, ?email: String, ?country_of_residence: String, ?partial_match_action: String, ?no_match_action: String, ?save_api_request: bool, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?selfie: Didit::upload, ?request_options: Didit::request_options?) -> Didit::Types::DatabaseValidationValidateResponse + def validate: (issuing_state: String, ?services: Array[String], ?validation_type: String, ?consent: bool, ?identification_number: String, ?first_name: String, ?last_name: String, ?middle_name: String, ?full_name: String, ?date_of_birth: Date | String, ?personal_number: String, ?tax_number: String, ?document_number: String, ?document_type: String, ?expiration_date: Date | String, ?date_of_issue: Date | String, ?nationality: String, ?gender: String, ?address: (Didit::Types::database_validation_validate_params_address_variant1 | String), ?address_element_1: String, ?address_element_2: String, ?address_element_3: String, ?address_element_4: String, ?address_element_5: String, ?postal_code: String, ?driver_license_number: String, ?driver_license_card_number: String, ?driver_license_state: String, ?driver_license_version: String, ?passport_number: String, ?passport_expiration_date: Date | String, ?passport_file_number: String, ?passport_issue_country: String, ?medicare_card_number: String, ?immi_card_number: String, ?immi_card_expiry_date: Date | String, ?citizenship_certificate_number: String, ?birth_registration_number: String, ?birth_registration_date: Date | String, ?birth_registration_state: String, ?marriage_certificate_number: String, ?change_of_name_certificate_number: String, ?first_partner_name: String, ?last_partner_name: String, ?voter_id: String, ?epic_card: String, ?pan: String, ?national_id: String, ?cic: String, ?identificador_ciudadano: String, ?ocr: String, ?voter_number: String, ?emission_number: String, ?bvn: String, ?bank_card_number: String, ?company_registration_number: String, ?company_name: String, ?initials: String, ?licence_number: String, ?refugee_file_number: String, ?bank_name: String, ?bank_account_number: String, ?account_type: String, ?phone_number: String, ?right_thumb: String, ?left_thumb: String, ?score_level: Integer, ?max_matches: Integer, ?vehicle_register_number: String, ?vehicle_licence_plate: String, ?vin: String, ?ssn: String, ?phone: String, ?landline: String, ?email: String, ?country_of_residence: String, ?partial_match_action: String, ?no_match_action: String, ?save_api_request: bool, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?selfie: Didit::upload, ?request_options: Didit::request_options?) -> Didit::Types::DatabaseValidationValidateResponse end end end diff --git a/sig/didit/resources/email.rbs b/sig/didit/resources/email.rbs index af625c4..09181da 100644 --- a/sig/didit/resources/email.rbs +++ b/sig/didit/resources/email.rbs @@ -4,7 +4,7 @@ module Didit module Resources class Email < Didit::Resource def assess_risk: (email: String, ?country_code: String, ?signals: Didit::Types::risk_signals, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?enable_social: bool, ?request_options: Didit::request_options?) -> Didit::Types::EmailRiskResponse - def check_code: (email: String, code: String, ?duplicated_email_action: String, ?breached_email_action: String, ?disposable_email_action: String, ?enable_social: bool, ?email_no_social_presence_action: String, ?request_options: Didit::request_options?) -> Didit::Types::EmailVerificationCheckResponse + def check_code: (email: String, code: String, ?duplicated_email_action: String, ?breached_email_action: String, ?disposable_email_action: String, ?enable_enrichment: bool, ?email_intelligence_score_action: String, ?recent_email_breach_action: String, ?frequent_email_breach_action: String, ?enable_social: bool, ?email_no_social_presence_action: String, ?request_options: Didit::request_options?) -> Didit::Types::EmailVerificationCheckResponse def send_code: (email: String, ?options: Didit::Types::email_send_code_params_options, ?signals: Didit::Types::email_send_code_params_signals, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?request_options: Didit::request_options?) -> Didit::Types::EmailVerificationSendResponse end end diff --git a/sig/didit/resources/id_wallets.rbs b/sig/didit/resources/id_wallets.rbs index beb3dc8..5c783a1 100644 --- a/sig/didit/resources/id_wallets.rbs +++ b/sig/didit/resources/id_wallets.rbs @@ -19,6 +19,7 @@ module Didit def start_franceconnect: (return_url: String, ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, ?device: String, ?idempotency_key: String, ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse def start_frejaid: (return_url: String, ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, ?device: String, ?idempotency_key: String, ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse def start_ftn: (return_url: String, ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, ?device: String, ?idempotency_key: String, ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse + def start_google_wallet: (country: String, origin: String, ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?idempotency_key: String, ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse def start_govbr: (return_url: String, ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, ?device: String, ?idempotency_key: String, ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse def start_govuk_wallet: (return_url: String, ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, ?device: String, ?idempotency_key: String, ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse def start_idcard_ee: (return_url: String, ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, ?device: String, ?idempotency_key: String, ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse @@ -32,6 +33,7 @@ module Didit def start_smart_id: (country: String, personal_code: String, ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?idempotency_key: String, ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse def start_uae_pass: (return_url: String, ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, ?device: String, ?idempotency_key: String, ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse def start_vipps: (return_url: String, ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, ?device: String, ?idempotency_key: String, ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse + def submit_verification_response: (String request_id, response: Hash[String | Symbol, untyped], ?request_options: Didit::request_options?) -> Didit::Types::DigitalIdWalletApiWalletVerificationResponse end end end diff --git a/sig/didit/resources/phone.rbs b/sig/didit/resources/phone.rbs index 1df4406..2f9ec8f 100644 --- a/sig/didit/resources/phone.rbs +++ b/sig/didit/resources/phone.rbs @@ -4,7 +4,7 @@ module Didit module Resources class Phone < Didit::Resource def assess_risk: (phone_number: String, ?country_code: String, ?signals: Didit::Types::risk_signals, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?enable_social: bool, ?request_options: Didit::request_options?) -> Didit::Types::PhoneRiskResponse - def check_code: (phone_number: String, code: String, ?duplicated_phone_number_action: String, ?disposable_number_action: String, ?voip_number_action: String, ?enable_social: bool, ?phone_no_social_presence_action: String, ?request_options: Didit::request_options?) -> Didit::Types::PhoneVerificationCheckResponse + def check_code: (phone_number: String, code: String, ?duplicated_phone_number_action: String, ?disposable_number_action: String, ?voip_number_action: String, ?enable_enrichment: bool, ?phone_intelligence_score_action: String, ?phone_type_risk_action: String, ?recent_port_action: String, ?low_phone_trust_action: String, ?enable_social: bool, ?phone_no_social_presence_action: String, ?request_options: Didit::request_options?) -> Didit::Types::PhoneVerificationCheckResponse def send_code: (phone_number: String, ?options: Didit::Types::phone_send_code_params_options, ?signals: Didit::Types::phone_send_code_params_signals, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?request_options: Didit::request_options?) -> Didit::Types::PhoneVerificationSendResponse end end diff --git a/sig/didit/resources/sessions.rbs b/sig/didit/resources/sessions.rbs index 4db68f5..1d41741 100644 --- a/sig/didit/resources/sessions.rbs +++ b/sig/didit/resources/sessions.rbs @@ -11,17 +11,23 @@ module Didit def batch_delete: (?session_numbers: Array[String], ?delete_all: bool, ?retain_face_embeddings: bool?, ?face_retention_days: Integer, ?face_retention_deadline: Time | String, ?deletion_instruction: String, ?instruction_id: String, ?filter_status: (String | Array[String]), ?filter_vendor_data: String, ?filter_search: String, ?filter_workflow_id: (String | Array[String]), ?filter_date_from: Date | String, ?filter_date_to: Date | String, ?filter_country: (String | Array[String]), ?filter_document_type: (String | Array[String]), ?filter_document_name: (String | Array[String]), ?filter_region: (String | Array[String]), ?filter_didit_internal_id: String, ?filter_session_type: (String | Array[String]), ?filter_api_service: String, ?filter_screened_full_name: String, ?filter_warning: (String | Array[String]), ?filter_status_initialized_as_in_review: bool, ?filter_is_kyc_to_be_reviewed: bool, ?filter_euuid: String, ?filter_organization_name: (String | Array[String]), ?request_options: Didit::request_options?) -> (Didit::Types::SessionsBatchDeleteResponse | Didit::Types::SessionDeletionJob) def bulk_update_aml_hit_status: (String session_id, hit_updates: Array[Didit::Types::sessions_bulk_update_aml_hit_status_params_hit_updates], ?node_id: String, ?node_id_query: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsBulkUpdateAmlHitStatusResponse def cancel_feature_override: (String session_id, String override_id, ?request_options: Didit::request_options?) -> Didit::Types::FeatureStatusOverride - def create: (workflow_id: String, ?vendor_data: String, ?callback: String, ?callback_method: String, ?metadata: untyped, ?tags: Array[String], ?language: String, ?contact_details: Didit::Types::sessions_create_params_contact_details, ?expected_details: Didit::Types::sessions_create_params_expected_details, ?portrait_image: String, ?sandbox_scenario: String, ?sign: Didit::Types::sessions_create_params_sign, ?user_state: String, ?biometric_consent: Didit::Types::sessions_create_params_biometric_consent, ?request_options: Didit::request_options?) -> Didit::Types::SessionsCreateResponse + def create: (workflow_id: String, ?vendor_data: String, ?multi_account_segment: String, ?callback: String, ?callback_method: String, ?metadata: untyped, ?tags: Array[String], ?language: String, ?contact_details: Didit::Types::sessions_create_params_contact_details, ?expected_details: Didit::Types::sessions_create_params_expected_details, ?portrait_image: String, ?sandbox_scenario: String, ?sign: Didit::Types::sessions_create_params_sign, ?user_state: String, ?biometric_consent: Didit::Types::sessions_create_params_biometric_consent, ?request_options: Didit::request_options?) -> Didit::Types::SessionsCreateResponse + def create_kyb_party_draft: (String session_id, entity_type: String, nationality: String, ?full_name: String, ?first_name: String, ?last_name: String, ?role: String, ?roles: Array[String], ?position: String, ?date_of_birth: (Date | String)?, ?company_name: String, ?registration_number: String, ?email: String, ?ownership_percent: (Float | Integer)?, ?phone_number: String, ?custom_fields: Hash[String | Symbol, untyped], ?skip_verification: bool, ?node_id: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsCreateKybPartyDraftResponse def delete: (String session_id, ?retain_face_embeddings: bool?, ?face_retention_days: Integer, ?face_retention_deadline: Time | String, ?deletion_instruction: String, ?instruction_id: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsDeleteResponse - def export_aml_screening_history: (String session_id, ?node_id: String, ?request_options: Didit::request_options?) -> String - | (String session_id, ?node_id: String, ?request_options: Didit::request_options?) { (String chunk) -> void } -> nil + def delete_kyb_party_draft: (String session_id, String draft_id, ?node_id: String, ?request_options: Didit::request_options?) -> nil + def export_aml_screening_history: (String session_id, ?node_id: String, ?month: String, ?request_options: Didit::request_options?) -> String + | (String session_id, ?node_id: String, ?month: String, ?request_options: Didit::request_options?) { (String chunk) -> void } -> nil + def export_files: (String session_id, ?request_options: Didit::request_options?) -> Didit::Types::SessionFilesExport def generate_pdf: (String session_id, ?request_options: Didit::request_options?) -> String | (String session_id, ?request_options: Didit::request_options?) { (String chunk) -> void } -> nil + def get_files_export: (String session_id, String export_id, ?request_options: Didit::request_options?) -> Didit::Types::SessionFilesExport def import_shared: (share_token: String, trust_review: bool, workflow_id: String, ?vendor_data: String?, ?request_options: Didit::request_options?) -> Didit::Types::SessionDecision - def list: (?session_kind: String, ?limit: Integer, ?offset: Integer, ?status: String, ?vendor_data: String, ?search: String, ?workflow_id: String, ?date_from: Date | String, ?date_to: Date | String, ?country: String, ?document_type: String, ?document_name: String, ?region: String, ?didit_internal_id: String, ?session_type: String, ?api_service: String, ?screened_full_name: String, ?warning: String, ?status_initialized_as_in_review: bool, ?is_kyc_to_be_reviewed: bool, ?euuid: String, ?organization_name: String, ?request_options: Didit::request_options?) -> Didit::Page[Didit::Types::SessionsListResponseResults] - def list_aml_screening_history: (String session_id, ?node_id: String, ?limit: Integer, ?offset: Integer, ?ordering: String, ?request_options: Didit::request_options?) -> Didit::Page[Didit::Types::AMLScreeningRun] + def list: (?session_kind: String, ?limit: Integer, ?offset: Integer, ?status: String, ?vendor_data: String, ?search: String, ?workflow_id: String, ?date_from: Date | String, ?date_to: Date | String, ?tags: String, ?decided_from: Time | String, ?decided_to: Time | String, ?country: String, ?document_type: String, ?document_name: String, ?region: String, ?didit_internal_id: String, ?session_type: String, ?api_service: String, ?screened_full_name: String, ?warning: String, ?status_initialized_as_in_review: bool, ?is_kyc_to_be_reviewed: bool, ?euuid: String, ?organization_name: String, ?request_options: Didit::request_options?) -> Didit::Page[Didit::Types::SessionsListResponseResults] + def list_aml_screening_history: (String session_id, ?node_id: String, ?month: String, ?limit: Integer, ?offset: Integer, ?ordering: String, ?request_options: Didit::request_options?) -> Didit::Page[Didit::Types::AMLScreeningRun] def list_events: (String session_id, ?limit: Integer, ?offset: Integer, ?ordering: String, ?request_options: Didit::request_options?) -> Didit::Page[Didit::Types::SessionEvent] def list_feature_overrides: (String session_id, ?request_options: Didit::request_options?) -> Didit::Types::SessionsListFeatureOverridesResponse + def list_kyb_extracted_parties: (String session_id, ?node_id: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsListKybExtractedPartiesResponse + def list_kyb_party_drafts: (String session_id, ?node_id: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsListKybPartyDraftsResponse def list_networks: (String session_id, ?request_options: Didit::request_options?) -> Didit::Types::EntityNetworkMembershipList def preview_decision_email: (String session_id, new_status: String, ?email_language: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsPreviewDecisionEmailResponse def preview_resubmission: (String session_id, ?nodes_to_resubmit: Array[Didit::Types::sessions_preview_resubmission_params_nodes_to_resubmit], ?email_address: String, ?email_language: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsPreviewResubmissionResponse @@ -30,6 +36,7 @@ module Didit def retrieve_deletion_job: (String job_id, ?request_options: Didit::request_options?) -> Didit::Types::SessionDeletionJob def share: (String session_id, for_application_id: String, ?ttl_in_seconds: Integer, ?request_options: Didit::request_options?) -> Didit::Types::SessionsShareResponse def simulate: (String session_id, ?new_status: String, ?comment: String, ?scenario: String, ?risk: String, ?node_id: String, ?send_webhooks: bool, ?request_options: Didit::request_options?) -> Didit::Types::SandboxSimulateResponse + def submit_kyb_parties: (String session_id, ?locale: String, ?node_id: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsSubmitKybPartiesResponse def update_aml_hit_status: (String session_id, hit_id: String, review_status: String, ?node_id: String, ?node_id_query: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsUpdateAmlHitStatusResponse def update_aml_status: (String session_id, status: String, ?node_id: String, ?node_id_query: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsUpdateAmlStatusResponse def update_data: (String session_id, ?document_type: String?, ?document_subtype: String?, ?document_number: String?, ?personal_number: String?, ?date_of_birth: (Date | String)?, ?date_of_issue: (Date | String)?, ?expiration_date: (Date | String)?, ?issuing_state: String?, ?first_name: String?, ?last_name: String?, ?gender: String?, ?address: String?, ?place_of_birth: String?, ?nationality: String?, ?marital_status: String, ?extra_fields: (Hash[String | Symbol, untyped])?, ?parsed_address: Didit::Types::sessions_update_data_params_parsed_address?, ?node_id: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsUpdateDataResponse @@ -37,8 +44,10 @@ module Didit def update_feature_status: (String session_id, String node_id, new_status: String, ?comment: String, ?feature_type: String, ?defer_until_flow_finishes: bool, ?request_options: Didit::request_options?) -> Didit::Types::SessionsUpdateFeatureStatusResponse def update_kyb_company_data: (String session_id, String company_uuid, ?company_name: String, ?registration_number: String, ?country_code: String, ?region: String?, ?incorporation_date: Date | String, ?registration_date: (Date | String)?, ?dissolution_date: (Date | String)?, ?tax_number: String, ?legal_address: String, ?company_type: String, ?registry_status: String?, ?verification_status: String?, ?alternative_names: String, ?nature_of_business: String, ?registered_capital: String, ?registered_capital_amount: (Float | Integer)?, ?registered_capital_currency: String?, ?website: String, ?email: String, ?phone: String, ?legal_entity_identifier: String, ?location_of_registration: String, ?vat_number: String, ?control_scheme: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsUpdateKybCompanyDataResponse def update_kyb_party: (String session_id, String party_uuid, is_skipped: bool, ?request_options: Didit::request_options?) -> Didit::Types::SessionsUpdateKybPartyResponse + def update_kyb_party_draft: (String session_id, String draft_id, ?entity_type: String, ?full_name: String, ?first_name: String, ?last_name: String, ?role: String, ?roles: Array[String], ?position: String, ?date_of_birth: (Date | String)?, ?company_name: String, ?registration_number: String, ?email: String, ?ownership_percent: (Float | Integer)?, ?nationality: String, ?phone_number: String, ?custom_fields: Hash[String | Symbol, untyped], ?skip_verification: bool, ?node_id: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsUpdateKybPartyDraftResponse def update_poa_data: (String session_id, ?issuing_state: String?, ?document_type: String, ?document_language: String?, ?issuer: String?, ?issue_date: (Date | String)?, ?poa_address: String?, ?name_on_document: String?, ?extra_fields: (Hash[String | Symbol, untyped])?, ?poa_parsed_address: Didit::Types::sessions_update_poa_data_params_poa_parsed_address?, ?node_id: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsUpdatePoaDataResponse def update_status: (String session_id, new_status: String, ?comment: String, ?nodes_to_resubmit: Array[Didit::Types::sessions_update_status_params_nodes_to_resubmit], ?send_email: bool, ?email_address: String, ?email_language: String, ?email_preview_token: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsUpdateStatusResponse + def upload_kyb_documents: (String session_id, documents: Array[Didit::upload], ?document_passwords: Array[String], ?document_group: String, ?locale: String, ?node_id: String, ?request_options: Didit::request_options?) -> Didit::Types::SessionsUploadKybDocumentsResponse class Imports < Didit::Resource def cancel: (String import_id, ?request_options: Didit::request_options?) -> Didit::Types::SessionImportJob def check_provider: (provider: String, credentials: Hash[String | Symbol, String], ?options: Didit::Types::sessions_imports_check_provider_params_options, ?record_ids: Array[String], ?request_options: Didit::request_options?) -> Didit::Types::SessionsImportsCheckProviderResponse diff --git a/sig/didit/resources/transactions.rbs b/sig/didit/resources/transactions.rbs index db45706..aee38ac 100644 --- a/sig/didit/resources/transactions.rbs +++ b/sig/didit/resources/transactions.rbs @@ -11,7 +11,7 @@ module Didit def create_sdk_token: (vendor_data: String, ?ttl_seconds: Integer, ?max_uses: Integer?, ?request_options: Didit::request_options?) -> Didit::Types::TransactionsCreateSdkTokenResponse def generate_pdf: (String transaction_uuid, ?request_options: Didit::request_options?) -> String | (String transaction_uuid, ?request_options: Didit::request_options?) { (String chunk) -> void } -> nil - def list: (?limit: Integer, ?offset: Integer, ?travel_rule_status: String, ?request_options: Didit::request_options?) -> Didit::Page[Didit::Types::TransactionsListResponseResults] + def list: (?limit: Integer, ?offset: Integer, ?travel_rule_status: String, ?assignee: String, ?request_options: Didit::request_options?) -> Didit::Page[Didit::Types::TransactionsListResponseResults] def list_networks: (String transaction_uuid, ?request_options: Didit::request_options?) -> Didit::Types::EntityNetworkMembershipList def list_party_networks: (String transaction_uuid, String transaction_party_uuid, ?request_options: Didit::request_options?) -> Didit::Types::EntityNetworkMembershipList def list_related: (String transaction_id, ?limit: Integer, ?offset: Integer, ?request_options: Didit::request_options?) -> Didit::Page[Didit::Types::TransactionSummary] diff --git a/sig/didit/resources/travel_rule.rbs b/sig/didit/resources/travel_rule.rbs index 64d6a9b..1d575af 100644 --- a/sig/didit/resources/travel_rule.rbs +++ b/sig/didit/resources/travel_rule.rbs @@ -6,6 +6,7 @@ module Didit def counterparty_contacts: () -> Didit::Resources::TravelRule::CounterpartyContacts def networks: () -> Didit::Resources::TravelRule::Networks def transfers: () -> Didit::Resources::TravelRule::Transfers + def unmatched_deposits: () -> Didit::Resources::TravelRule::UnmatchedDeposits def wallet_addresses: () -> Didit::Resources::TravelRule::WalletAddresses def wallet_proofs: () -> Didit::Resources::TravelRule::WalletProofs def workspace: () -> Didit::Resources::TravelRule::Workspace @@ -38,6 +39,10 @@ module Didit class Transfers < Didit::Resource def list: (?direction: String, ?status: String, ?rail: String, ?kind: String, ?currency: String, ?start_date: Date | String, ?end_date: Date | String, ?counterparty: String, ?limit: Integer, ?offset: Integer, ?request_options: Didit::request_options?) -> Didit::Page[Didit::Types::TravelRuleTransferRow] end + class UnmatchedDeposits < Didit::Resource + def list: (?direction: String, ?status: String, ?rail: String, ?kind: String, ?currency: String, ?start_date: Date | String, ?end_date: Date | String, ?counterparty: String, ?limit: Integer, ?offset: Integer, ?request_options: Didit::request_options?) -> Didit::Page[Didit::Types::TravelRuleTransferRow] + def match: (String transaction_uuid, transaction_id: String, ?request_options: Didit::request_options?) -> Didit::Types::TravelRuleManualMatchResponse + end class WalletAddresses < Didit::Resource def bulk_import: (body: (Didit::Types::travel_rule_wallet_addresses_bulk_import_params_variant1 | Array[Didit::Types::wallet_address_import_row]), ?request_options: Didit::request_options?) -> Didit::Types::WalletAddressImportReport def create: (address: String, ?chain: String, ?holder_vendor_data: String, ?holder_name: String, ?entity_type: String, ?self_declared: bool, ?travel_address: String, ?memo: String, ?request_options: Didit::request_options?) -> Didit::Types::WalletAddressEntry diff --git a/sig/didit/resources/users.rbs b/sig/didit/resources/users.rbs index d043a88..d4ea15f 100644 --- a/sig/didit/resources/users.rbs +++ b/sig/didit/resources/users.rbs @@ -3,7 +3,7 @@ module Didit module Resources class Users < Didit::Resource - def batch_delete: (?vendor_data_list: Array[String], ?didit_internal_id_list: Array[String], ?delete_all: bool, ?request_options: Didit::request_options?) -> Didit::Types::UsersBatchDeleteResponse + def batch_delete: (?vendor_data_list: Array[String], ?didit_internal_id_list: Array[String], ?delete_all: bool, ?retain_face_embeddings: bool, ?face_retention_days: Integer, ?request_options: Didit::request_options?) -> Didit::Types::UsersBatchDeleteResponse def create: (vendor_data: String, ?full_name: String?, ?display_name: String?, ?date_of_birth: (Date | String)?, ?status: String, ?metadata: (Hash[String | Symbol, untyped])?, ?approved_emails: Array[String], ?approved_phones: Array[String], ?issuing_states: Array[String], ?first_name: String, ?last_name: String, ?email: String, ?phone_number: String, ?country: String, ?send_verification_link: bool, ?workflow_id: String, ?language: String, ?request_options: Didit::request_options?) -> Didit::Types::UsersCreateResponse def generate_pdf: (String vendor_data, ?request_options: Didit::request_options?) -> String | (String vendor_data, ?request_options: Didit::request_options?) { (String chunk) -> void } -> nil diff --git a/sig/didit/resources/wallet_screening.rbs b/sig/didit/resources/wallet_screening.rbs index 2fcf649..ad3a055 100644 --- a/sig/didit/resources/wallet_screening.rbs +++ b/sig/didit/resources/wallet_screening.rbs @@ -3,7 +3,7 @@ module Didit module Resources class WalletScreening < Didit::Resource - def screen: (wallet_address: String, blockchain: String, ?direction: String, ?request_options: Didit::request_options?) -> Didit::Types::WalletScreeningResult + def screen: (wallet_address: String, ?blockchain: String, ?direction: String, ?request_options: Didit::request_options?) -> Didit::Types::WalletScreeningResult def screen_pdf: (provider: String, screening_type: String, risk_score: Integer, severity: String, status: String, summary: String, wallet_address: String, blockchain: String, source_of_funds: Array[Didit::Types::wallet_screening_result_source_of_funds], destination_of_funds: Array[Didit::Types::wallet_screening_result_destination_of_funds], counterparty_connections: Array[Didit::Types::wallet_screening_result_counterparty_connections], sanctions_hit: bool, dominant_risk_category: String?, report_signature: String, ?transaction_hash: String?, ?block_timestamp: String?, ?total_value_usd: (Float | Integer)?, ?fee_usd: (Float | Integer)?, ?sender_rows: Array[Hash[String | Symbol, untyped]], ?receiver_rows: Array[Hash[String | Symbol, untyped]], ?transaction_flows: Array[Hash[String | Symbol, untyped]], ?transaction_flows_status: String?, ?transaction_flows_error: String?, ?network_nodes: Array[Hash[String | Symbol, untyped]], ?network_edges: Array[Hash[String | Symbol, untyped]], ?pep_counterparty: bool?, ?risk_factors: Array[Didit::Types::wallet_screening_result_risk_factors], ?raw_response: Hash[String | Symbol, untyped], ?request_options: Didit::request_options?) -> String | (provider: String, screening_type: String, risk_score: Integer, severity: String, status: String, summary: String, wallet_address: String, blockchain: String, source_of_funds: Array[Didit::Types::wallet_screening_result_source_of_funds], destination_of_funds: Array[Didit::Types::wallet_screening_result_destination_of_funds], counterparty_connections: Array[Didit::Types::wallet_screening_result_counterparty_connections], sanctions_hit: bool, dominant_risk_category: String?, report_signature: String, ?transaction_hash: String?, ?block_timestamp: String?, ?total_value_usd: (Float | Integer)?, ?fee_usd: (Float | Integer)?, ?sender_rows: Array[Hash[String | Symbol, untyped]], ?receiver_rows: Array[Hash[String | Symbol, untyped]], ?transaction_flows: Array[Hash[String | Symbol, untyped]], ?transaction_flows_status: String?, ?transaction_flows_error: String?, ?network_nodes: Array[Hash[String | Symbol, untyped]], ?network_edges: Array[Hash[String | Symbol, untyped]], ?pep_counterparty: bool?, ?risk_factors: Array[Didit::Types::wallet_screening_result_risk_factors], ?raw_response: Hash[String | Symbol, untyped], ?request_options: Didit::request_options?) { (String chunk) -> void } -> nil end diff --git a/sig/didit/resources/webhooks.rbs b/sig/didit/resources/webhooks.rbs index 978bb3f..8cde749 100644 --- a/sig/didit/resources/webhooks.rbs +++ b/sig/didit/resources/webhooks.rbs @@ -6,7 +6,7 @@ module Didit include ::Didit::Webhooks::ClientMethods def destinations: () -> Didit::Resources::Webhooks::Destinations def retrieve_config: (?request_options: Didit::request_options?) -> Didit::Types::WebhookConfig - def update_config: (?webhook_url: String?, ?webhook_version: String, ?rotate_secret_key: bool, ?capture_method: String, ?data_retention_months: Integer?, ?face_retention_policy: String, ?face_retention_days: Integer?, ?biometric_consent_mode: String, ?allowed_return_hosts: Array[String], ?request_options: Didit::request_options?) -> Didit::Types::WebhookConfig + def update_config: (?webhook_url: String?, ?webhook_version: String, ?rotate_secret_key: bool, ?capture_method: String, ?data_retention_months: Integer?, ?face_retention_policy: String, ?face_retention_days: Integer?, ?biometric_consent_mode: String, ?allowed_return_hosts: Array[String], ?allowed_domains: Array[String], ?request_options: Didit::request_options?) -> Didit::Types::WebhookConfig class Destinations < Didit::Resource def create: (label: String, url: String, ?enabled: bool, ?webhook_version: String, ?subscribed_events: Array[String], ?request_options: Didit::request_options?) -> Didit::Types::WebhooksDestinationsCreateResponse def delete: (String destination_uuid, ?request_options: Didit::request_options?) -> nil diff --git a/sig/didit/types/aml.rbs b/sig/didit/types/aml.rbs index 961dd04..672c2ae 100644 --- a/sig/didit/types/aml.rbs +++ b/sig/didit/types/aml.rbs @@ -24,6 +24,24 @@ module Didit VALUES: Array[String] end + module AmlScreenResponseAmlHitsDatasets + PEP: String + PEP_LEVEL_1: String + PEP_LEVEL_2: String + PEP_LEVEL_3: String + PEP_LEVEL_4: String + SANCTIONS: String + ADVERSE_MEDIA: String + WARNINGS_AND_REGULATORY_ENFORCEMENT: String + FITNESS_AND_PROBITY: String + SIP: String + SIE: String + INSOLVENCY: String + OTHER_LISTS: String + + VALUES: Array[String] + end + module AmlScreenResponseAmlHitsReviewStatus FALSE_POSITIVE: String UNREVIEWED: String diff --git a/sig/didit/types/components.rbs b/sig/didit/types/components.rbs index ba0e12e..0c64640 100644 --- a/sig/didit/types/components.rbs +++ b/sig/didit/types/components.rbs @@ -75,6 +75,7 @@ module Didit SIP: String SIE: String INSOLVENCY: String + OTHER_LISTS: String VALUES: Array[String] end @@ -163,6 +164,8 @@ module Didit KYB_REGISTRY: String KYB_DOCUMENTS: String KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String VALUES: Array[String] end @@ -843,6 +846,16 @@ module Didit VALUES: Array[String] end + module DigitalIdWalletApiGoogleWalletWalletVerificationStartCountryEnum + USA: String + GBR: String + BRA: String + SGP: String + TWN: String + + VALUES: Array[String] + end + module DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum BRA: String @@ -864,6 +877,7 @@ module Didit module DigitalIdWalletApiInteractionEnum REDIRECT: String IN_APP: String + DIGITAL_CREDENTIALS: String VALUES: Array[String] end @@ -913,6 +927,7 @@ module Didit module DigitalIdWalletApiWalletNextActionTypeEnum REDIRECT: String CONFIRM_IN_APP: String + REQUEST_DIGITAL_CREDENTIAL: String VALUES: Array[String] end @@ -927,6 +942,13 @@ module Didit VALUES: Array[String] end + module EmailIntelligenceReasonCodesDirection + RISK: String + TRUST: String + + VALUES: Array[String] + end + module EmailRiskResponseEmailStatus APPROVED: String IN_REVIEW: String @@ -1151,6 +1173,244 @@ module Didit VALUES: Array[String] end + module GeolocationAttemptAccuracyConfidence + P95: String + P68: String + UNSPECIFIED: String + + VALUES: Array[String] + end + + module GeolocationAttemptGeofenceBasis + DEVICE: String + IP: String + + VALUES: Array[String] + end + + module GeolocationAttemptGeofenceResult + INSIDE: String + OUTSIDE: String + UNDETERMINED: String + + VALUES: Array[String] + end + + module GeolocationAttemptIntegrity + ATTESTED: String + NOT_ATTESTED: String + FAILED: String + UNSUPPORTED: String + NOT_DETERMINED: String + + VALUES: Array[String] + end + + module GeolocationAttemptOutcome + VERIFIED: String + LOW_ACCURACY: String + ACCURACY_UNDETERMINED: String + STALE: String + APPROXIMATE: String + DENIED: String + RESTRICTED: String + UNAVAILABLE: String + TIMEOUT: String + MOCK_DETECTED: String + OUTSIDE_GEOFENCE: String + IN_BLOCKED_AREA: String + ANONYMIZER_DETECTED: String + SKIPPED: String + REPLAY_REJECTED: String + UNSUPPORTED_CLIENT: String + + VALUES: Array[String] + end + + module GeolocationAttemptPermission + GRANTED_PRECISE: String + GRANTED_APPROXIMATE: String + DENIED: String + RESTRICTED: String + UNAVAILABLE: String + TIMEOUT: String + DISMISSED: String + NOT_REQUESTED: String + + VALUES: Array[String] + end + + module GeolocationAttemptPlatform + WEB: String + IOS: String + ANDROID: String + REACT_NATIVE: String + FLUTTER: String + + VALUES: Array[String] + end + + module GeolocationAttemptPositionSource + DEVICE_AND_IP: String + DEVICE_ONLY: String + IP_ONLY: String + + VALUES: Array[String] + end + + module GeolocationAttemptSource + GPS: String + FUSED: String + NETWORK: String + WIFI: String + CELL: String + BROWSER: String + UNKNOWN: String + IP: String + + VALUES: Array[String] + end + + module GeolocationAttemptStatus + NOT_FINISHED: String + APPROVED: String + DECLINED: String + IN_REVIEW: String + RESUB_REQUESTED: String + + VALUES: Array[String] + end + + module GeolocationCheckAccuracyConfidence + P95: String + P68: String + UNSPECIFIED: String + + VALUES: Array[String] + end + + module GeolocationCheckGeofenceBasis + DEVICE: String + IP: String + + VALUES: Array[String] + end + + module GeolocationCheckGeofenceResult + INSIDE: String + OUTSIDE: String + UNDETERMINED: String + + VALUES: Array[String] + end + + module GeolocationCheckIntegrity + ATTESTED: String + NOT_ATTESTED: String + FAILED: String + UNSUPPORTED: String + NOT_DETERMINED: String + + VALUES: Array[String] + end + + module GeolocationCheckOutcome + VERIFIED: String + LOW_ACCURACY: String + ACCURACY_UNDETERMINED: String + STALE: String + APPROXIMATE: String + DENIED: String + RESTRICTED: String + UNAVAILABLE: String + TIMEOUT: String + MOCK_DETECTED: String + OUTSIDE_GEOFENCE: String + IN_BLOCKED_AREA: String + ANONYMIZER_DETECTED: String + SKIPPED: String + REPLAY_REJECTED: String + UNSUPPORTED_CLIENT: String + + VALUES: Array[String] + end + + module GeolocationCheckPermission + GRANTED_PRECISE: String + GRANTED_APPROXIMATE: String + DENIED: String + RESTRICTED: String + UNAVAILABLE: String + TIMEOUT: String + DISMISSED: String + NOT_REQUESTED: String + + VALUES: Array[String] + end + + module GeolocationCheckPlatform + WEB: String + IOS: String + ANDROID: String + REACT_NATIVE: String + FLUTTER: String + + VALUES: Array[String] + end + + module GeolocationCheckPositionSource + DEVICE_AND_IP: String + DEVICE_ONLY: String + IP_ONLY: String + + VALUES: Array[String] + end + + module GeolocationCheckSource + GPS: String + FUSED: String + NETWORK: String + WIFI: String + CELL: String + BROWSER: String + UNKNOWN: String + IP: String + + VALUES: Array[String] + end + + module GeolocationCheckStatus + NOT_FINISHED: String + APPROVED: String + DECLINED: String + IN_REVIEW: String + RESUB_REQUESTED: String + + VALUES: Array[String] + end + + module GeolocationCheckWarningsFeature + ID_VERIFICATION: String + NFC: String + LIVENESS: String + FACEMATCH: String + PROOF_OF_ADDRESS: String + PHONE: String + EMAIL: String + AML: String + LOCATION: String + DATABASE_VALIDATION: String + QUESTIONNAIRE: String + DOCUMENT_AI: String + KYB_REGISTRY: String + KYB_DOCUMENTS: String + KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String + + VALUES: Array[String] + end + module IPRiskResponseIpStatus APPROVED: String IN_REVIEW: String @@ -1469,6 +1729,27 @@ module Didit VALUES: Array[String] end + module KYBOwnershipStructureOwnerEntityType + PERSON: String + COMPANY: String + + VALUES: Array[String] + end + + module KYBRegistryDataOwnershipError + NO_OWNERS_ON_RECORD: String + NO_NATURAL_PERSON_OWNER: String + OWNERSHIP_SECTION_UNAVAILABLE: String + COMPANY_NOT_FOUND: String + AMBIGUOUS_COMPANY_MATCH: String + MISSING_REGISTRATION_NUMBER: String + ENTITY_TYPE_NOT_COVERED: String + PROVIDER_UNAVAILABLE: String + OTHER: String + + VALUES: Array[String] + end + module KYBRegistryOwnershipStatus NOT_REQUESTED: String PENDING: String @@ -1516,6 +1797,12 @@ module Didit VALUES: Array[String] end + module KYBRegistrySourceSourceType + OFFICIAL: String + + VALUES: Array[String] + end + module MonitoringEventCreateRequestEventCategory AUTH: String SESSION: String @@ -1820,6 +2107,13 @@ module Didit VALUES: Array[String] end + module PhoneIntelligenceReasonCodesDirection + RISK: String + TRUST: String + + VALUES: Array[String] + end + module PhoneRiskResponsePhoneStatus APPROVED: String IN_REVIEW: String @@ -2128,6 +2422,16 @@ module Didit KYB_REGISTRY: String KYB_DOCUMENTS: String KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String + + VALUES: Array[String] + end + + module SessionDecisionDecisionTraceDecidedBy + MANUAL: String + AUTOMATIC: String + INVESTIGATOR: String VALUES: Array[String] end @@ -2221,6 +2525,8 @@ module Didit KYB_REGISTRY: String KYB_DOCUMENTS: String KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String VALUES: Array[String] end @@ -2277,6 +2583,8 @@ module Didit KYB_REGISTRY: String KYB_DOCUMENTS: String KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String VALUES: Array[String] end @@ -2416,6 +2724,8 @@ module Didit KYB_REGISTRY: String KYB_DOCUMENTS: String KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String VALUES: Array[String] end @@ -2476,6 +2786,8 @@ module Didit KYB_REGISTRY: String KYB_DOCUMENTS: String KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String VALUES: Array[String] end @@ -2745,6 +3057,8 @@ module Didit KYB_REGISTRY: String KYB_DOCUMENTS: String KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String VALUES: Array[String] end @@ -2855,6 +3169,8 @@ module Didit KYB_REGISTRY: String KYB_DOCUMENTS: String KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String VALUES: Array[String] end @@ -2892,6 +3208,8 @@ module Didit KYB_REGISTRY: String KYB_DOCUMENTS: String KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String VALUES: Array[String] end @@ -2922,6 +3240,8 @@ module Didit KYB_REGISTRY: String KYB_DOCUMENTS: String KYB_KEY_PEOPLE: String + GEOLOCATION: String + SIGNATURE: String VALUES: Array[String] end @@ -3059,6 +3379,16 @@ module Didit VALUES: Array[String] end + module SessionFilesExportStatus + PENDING: String + PROCESSING: String + READY: String + FAILED: String + EXPIRED: String + + VALUES: Array[String] + end + module SessionImportJobImportType USER_VERIFICATION: String BUSINESS_VERIFICATION: String @@ -3247,12 +3577,14 @@ module Didit end module SignatureResultFormat + PDF: String PADES: String VALUES: Array[String] end module SignatureResultLevel + SIMPLE: String AES: String QES: String @@ -4800,6 +5132,7 @@ module Didit TRANSACTION_STATUS_UPDATED: String TRAVEL_RULE_STATUS_UPDATED: String WORKFLOW_COMPLIANCE_CHANGED: String + TRANSACTION_RULE_SUGGESTIONS_CREATED: String AUTH_SIGNUP: String AUTH_LOGIN: String AUTH_LOGIN_FAILED: String @@ -5185,6 +5518,7 @@ module Didit class AMLScreeningRun < Didit::Model def uuid: () -> String + def run_id: () -> String def completed_at: () -> Time def started_at: () -> Time def outcome: () -> String @@ -5193,6 +5527,8 @@ module Didit def status: () -> String? def score: () -> Float? def total_hits: () -> Integer? + def new_hits: () -> Integer? + def entities_screened: () -> Integer def dataset_freshness: () -> Didit::Types::AMLDatasetFreshness? end @@ -5371,6 +5707,24 @@ module Didit def abandoned: () -> Integer? end + class ApplicationAnalyticsToday < Didit::Model + def time_zone: () -> String + def date: () -> Date + def current_hour: () -> Integer + def previous_date: () -> Date + def hours: () -> Array[Integer] + def previous_hours: () -> Array[Integer] + def total: () -> Integer + def previous_total_so_far: () -> Integer + def outcomes: () -> Didit::Types::ApplicationAnalyticsTodayOutcomes + end + + class ApplicationAnalyticsTodayOutcomes < Didit::Model + def approved: () -> Integer + def in_review: () -> Integer + def declined: () -> Integer + end + class ApplicationAnalyticsVerificationTimePoint < Didit::Model def date: () -> String? def overall_avg: () -> Float? @@ -5610,6 +5964,11 @@ module Didit def requested_scopes: () -> Array[String]? end + class BiometricRetention < Didit::Model + def jurisdictions: () -> Array[String] + def deletes_at: () -> Time? + end + class BlocklistedItem < Didit::Model def `type`: () -> String def session_id: () -> String @@ -6327,6 +6686,11 @@ module Didit def wallets: () -> Array[Didit::Types::DigitalIdWalletApiWalletCatalogEntry] end + class DigitalIdWalletApiWalletDigitalCredentialsRequest < Didit::Model + def protocol: () -> String + def request: () -> Hash[String, untyped] + end + class DigitalIdWalletApiWalletIdentity < Didit::Model def full_name: () -> String? def first_name: () -> String? @@ -6339,6 +6703,7 @@ module Didit class DigitalIdWalletApiWalletNextAction < Didit::Model def `type`: () -> String def url: () -> String? + def digital_credentials: () -> Didit::Types::DigitalIdWalletApiWalletDigitalCredentialsRequest? def verification_code: () -> String? def poll_interval_seconds: () -> Integer? end @@ -6394,7 +6759,15 @@ module Didit def is_free_domain: () -> bool? def is_breached: () -> bool? def no_of_breaches: () -> Float? - def reason_codes: () -> Array[String]? + def reason_codes: () -> Array[Didit::Types::EmailIntelligenceReasonCodes]? + end + + class EmailIntelligenceReasonCodes < Didit::Model + def code: () -> String? + def value: () -> untyped + def direction: () -> String? + def message: () -> String? + def impact_level: () -> String? end class EmailMatchItem < Didit::Model @@ -6489,6 +6862,7 @@ module Didit def lifecycle: () -> Array[Didit::Types::EmailVerificationCheckResponseEmailLifecycle]? def matches: () -> Array[Didit::Types::EmailVerificationCheckResponseEmailMatches]? def email_social: () -> Didit::Types::EmailSocialFootprint? + def email_intelligence: () -> Didit::Types::EmailIntelligence? end class EmailVerificationCheckResponseEmailBreaches < Didit::Model @@ -6655,6 +7029,131 @@ module Didit def evidence_indexes: () -> Array[Integer] end + class GeolocationAttempt < Didit::Model + def node_id: () -> String? + def status: () -> String? + def outcome: () -> String? + def permission: () -> String? + def latitude: () -> Float? + def longitude: () -> Float? + def accuracy_m: () -> Float? + def accuracy_confidence: () -> String? + def measured_at: () -> Time? + def age_seconds: () -> Integer? + def source: () -> String? + def platform: () -> String? + def sdk_version: () -> String? + def is_mock: () -> bool? + def produced_by_accessory: () -> bool? + def integrity: () -> String? + def country_code: () -> String? + def region_code: () -> String? + def city: () -> String? + def geofence: () -> Didit::Types::GeolocationAttemptGeofence? + def inside_geofence: () -> bool? + def geofence_basis: () -> String? + def inside_areas: () -> Array[String]? + def blocked_areas: () -> Array[String]? + def position_source: () -> String? + def anonymizers: () -> Didit::Types::GeolocationAttemptAnonymizers? + def ip_distance_km: () -> Float? + def ip_distance_uncertainty_km: () -> Float? + def ip_consistent: () -> bool? + def document_distance_km: () -> Float? + def travel_excused: () -> bool? + def consecutive_mismatches: () -> Integer? + def attempts: () -> Integer? + def consent: () -> Didit::Types::GeolocationAttemptConsent? + def received_at: () -> Time? + def created_at: () -> Time? + end + + class GeolocationAttemptAnonymizers < Didit::Model + def vpn: () -> bool? + def proxy: () -> bool? + def tor: () -> bool? + def spoofing: () -> bool? + def emulator: () -> bool? + end + + class GeolocationAttemptConsent < Didit::Model + def accepted_at: () -> Time? + def version: () -> String? + def locale: () -> String? + end + + class GeolocationAttemptGeofence < Didit::Model + def enabled: () -> bool? + def result: () -> String? + end + + class GeolocationCheck < Didit::Model + def node_id: () -> String? + def status: () -> String? + def outcome: () -> String? + def permission: () -> String? + def latitude: () -> Float? + def longitude: () -> Float? + def accuracy_m: () -> Float? + def accuracy_confidence: () -> String? + def measured_at: () -> Time? + def age_seconds: () -> Integer? + def source: () -> String? + def platform: () -> String? + def sdk_version: () -> String? + def is_mock: () -> bool? + def produced_by_accessory: () -> bool? + def integrity: () -> String? + def country_code: () -> String? + def region_code: () -> String? + def city: () -> String? + def geofence: () -> Didit::Types::GeolocationCheckGeofence? + def inside_geofence: () -> bool? + def geofence_basis: () -> String? + def inside_areas: () -> Array[String]? + def blocked_areas: () -> Array[String]? + def position_source: () -> String? + def anonymizers: () -> Didit::Types::GeolocationCheckAnonymizers? + def ip_distance_km: () -> Float? + def ip_distance_uncertainty_km: () -> Float? + def ip_consistent: () -> bool? + def document_distance_km: () -> Float? + def travel_excused: () -> bool? + def consecutive_mismatches: () -> Integer? + def attempts: () -> Integer? + def consent: () -> Didit::Types::GeolocationCheckConsent? + def warnings: () -> Array[Didit::Types::GeolocationCheckWarnings]? + end + + class GeolocationCheckAnonymizers < Didit::Model + def vpn: () -> bool? + def proxy: () -> bool? + def tor: () -> bool? + def spoofing: () -> bool? + def emulator: () -> bool? + end + + class GeolocationCheckConsent < Didit::Model + def accepted_at: () -> Time? + def version: () -> String? + def locale: () -> String? + end + + class GeolocationCheckGeofence < Didit::Model + def enabled: () -> bool? + def result: () -> String? + end + + class GeolocationCheckWarnings < Didit::Model + def feature: () -> String? + def risk: () -> String? + def additional_data: () -> Hash[String, untyped]? + def log_type: () -> String? + def short_description: () -> String? + def long_description: () -> String? + def node_id: () -> String? + end + class IPRiskResponse < Didit::Model def request_id: () -> String def status: () -> String @@ -6912,6 +7411,32 @@ module Didit def status: () -> String end + class KYBOwnershipStructure < Didit::Model + def shareholders: () -> Array[Didit::Types::KYBOwnershipStructureOwner] + def beneficial_owners: () -> Array[Didit::Types::KYBOwnershipStructureOwner] + end + + class KYBOwnershipStructureOwner < Didit::Model + def name: () -> String? + def first_name: () -> String? + def last_name: () -> String? + def date_of_birth: () -> String? + def country_of_birth: () -> String? + def company_name: () -> String? + def registration_number: () -> String? + def entity_type: () -> String? + def nationality: () -> String? + def designation: () -> String? + def roles: () -> Array[String] + def ownership_min_shares: () -> String? + def ownership_max_shares: () -> String? + def voting_min_shares: () -> String? + def voting_max_shares: () -> String? + def appointment_date: () -> String? + def is_active: () -> bool? + def shareholding: () -> Didit::Types::KYBRegistryShareholding? + end + class KYBRegistryAddress < Didit::Model def `type`: () -> String? def address: () -> String @@ -6923,6 +7448,49 @@ module Didit def description: () -> String? end + class KYBRegistryData < Didit::Model + def company_name: () -> String? + def registration_number: () -> String? + def country_code: () -> String? + def region: () -> String? + def incorporation_date: () -> String? + def registration_date: () -> String? + def dissolution_date: () -> String? + def tax_number: () -> String? + def vat_number: () -> String? + def legal_address: () -> String? + def registered_address: () -> String? + def company_type: () -> String? + def registry_status: () -> String? + def verification_status: () -> String? + def alternative_names: () -> String? + def nature_of_business: () -> String? + def registered_capital: () -> String? + def registered_capital_amount: () -> String? + def registered_capital_currency: () -> String? + def website: () -> String? + def email: () -> String? + def phone: () -> String? + def legal_entity_identifier: () -> String? + def location_of_registration: () -> String? + def control_scheme: () -> String? + def ownership_error: () -> String? + def section_errors: () -> Hash[String, Didit::Types::KYBRegistrySectionError]? + def ubo_resolution: () -> Didit::Types::KYBRegistryUboResolution? + def lite_enrichment: () -> Didit::Types::KYBRegistryLiteEnrichment? + def registry_metadata: () -> (Hash[String, (String | Float | bool)])? + def registry_sources: () -> Array[Didit::Types::KYBRegistrySource]? + def previous_names: () -> Array[String]? + def parent_companies: () -> Array[String]? + def documents_available: () -> Integer? + end + + class KYBRegistryGroupCompany < Didit::Model + def name: () -> String? + def country_code: () -> String? + def registration_number: () -> String? + end + class KYBRegistryIndustry < Didit::Model def code: () -> String? def description: () -> String? @@ -6930,6 +7498,11 @@ module Didit def is_primary: () -> bool end + class KYBRegistryLiteEnrichment < Didit::Model + def fields: () -> Array[String] + def people_added: () -> Integer + end + class KYBRegistryOwnership < Didit::Model def status: () -> String? def tier_requested: () -> String? @@ -6968,6 +7541,10 @@ module Didit def per_page: () -> Integer? end + class KYBRegistrySectionError < Didit::Model + def status_code: () -> Integer? + end + class KYBRegistryShareholding < Didit::Model def share_class: () -> String? def number_of_shares: () -> Float? @@ -6977,6 +7554,22 @@ module Didit def percentage: () -> Float? end + class KYBRegistrySource < Didit::Model + def name: () -> String + def source_type: () -> String + end + + class KYBRegistryUboResolution < Didit::Model + def parent_chain: () -> Array[Didit::Types::KYBRegistryGroupCompany] + def subsidiaries: () -> Array[Didit::Types::KYBRegistryGroupCompany] + def unresolved: () -> Array[Didit::Types::KYBRegistryUboResolutionUnresolved] + end + + class KYBRegistryUboResolutionUnresolved < Didit::Model + def reason: () -> String + def section: () -> String? + end + class MonitoringEvent < Didit::Model def event_uuid: () -> String def event_id: () -> String @@ -7460,7 +8053,15 @@ module Didit def is_ported: () -> bool? def is_recently_ported: () -> bool? def carrier_type: () -> String? - def reason_codes: () -> Array[String]? + def reason_codes: () -> Array[Didit::Types::PhoneIntelligenceReasonCodes]? + end + + class PhoneIntelligenceReasonCodes < Didit::Model + def code: () -> String? + def value: () -> untyped + def direction: () -> String? + def message: () -> String? + def impact_level: () -> String? end class PhoneMatchItem < Didit::Model @@ -7557,6 +8158,7 @@ module Didit def lifecycle: () -> Array[Didit::Types::PhoneVerificationCheckResponsePhoneLifecycle]? def matches: () -> Array[Didit::Types::PhoneVerificationCheckResponsePhoneMatches]? def phone_social: () -> Didit::Types::PhoneSocialFootprint? + def phone_intelligence: () -> Didit::Types::PhoneIntelligence? end class PhoneVerificationCheckResponsePhoneCarrier < Didit::Model @@ -7799,9 +8401,13 @@ module Didit def session_id: () -> String? def session_kind: () -> String? def shared_from_session: () -> String? + def shared_from_session_number: () -> Integer? def session_number: () -> Integer? def session_url: () -> String? def status: () -> String? + def status_override: () -> Didit::Types::SessionDecisionStatusOverride? + def decision_trace: () -> Didit::Types::SessionDecisionDecisionTrace? + def linked_records: () -> Didit::Types::SessionDecisionLinkedRecords? def workflow_id: () -> String? def features: () -> Array[String]? def vendor_data: () -> String? @@ -7823,17 +8429,33 @@ module Didit def signatures: () -> Array[Didit::Types::SignatureResult]? def aml_screenings: () -> Array[Didit::Types::AMLScreening]? def ip_analyses: () -> Array[Didit::Types::SessionDecisionIpAnalyses]? + def geolocation_checks: () -> Array[Didit::Types::GeolocationCheck]? + def geolocation_attempts: () -> Array[Didit::Types::GeolocationAttempt]? def database_validations: () -> Array[Didit::Types::SessionDecisionDatabaseValidations]? + def database_validation_not_performed_reason: () -> Didit::Types::SessionDecisionDatabaseValidationNotPerformedReason? def reviews: () -> Array[Didit::Types::SessionDecisionReviews]? + def assignee: () -> Didit::Types::SessionDecisionAssignee? + def waiting_since: () -> Time? + def sla_due_at: () -> Time? def created_at: () -> Time? def expires_at: () -> Time? def registry_checks: () -> Array[Didit::Types::SessionDecisionRegistryChecks]? def key_people_checks: () -> Array[Didit::Types::SessionDecisionKeyPeopleChecks]? def document_verifications: () -> Array[Didit::Types::SessionDecisionDocumentVerifications]? def environment: () -> String? + def sandbox_scenario: () -> String? def resubmissions: () -> Array[Didit::Types::SessionDecisionResubmissions]? def biometric_consent: () -> Didit::Types::SessionDecisionBiometricConsent? def investigator: () -> Didit::Types::InvestigatorBlock? + def biometric_retention: () -> Didit::Types::BiometricRetention? + def fraud_check: () -> Hash[String, untyped]? + def full_session_video: () -> String? + def full_session_video_recorded_at: () -> Time? + end + + class SessionDecisionAssignee < Didit::Model + def email: () -> String? + def assigned_at: () -> Time? end class SessionDecisionBiometricConsent < Didit::Model @@ -7873,6 +8495,11 @@ module Didit def phone: () -> String? end + class SessionDecisionDatabaseValidationNotPerformedReason < Didit::Model + def code: () -> String? + def message: () -> String? + end + class SessionDecisionDatabaseValidations < Didit::Model def node_id: () -> String? def issuing_state: () -> String? @@ -7925,6 +8552,32 @@ module Didit def node_id: () -> String? end + class SessionDecisionDecisionTrace < Didit::Model + def status: () -> String? + def decided_by: () -> String? + def decided_at: () -> Time? + def automatic_status: () -> String? + def terminal_node_id: () -> String? + def actor: () -> Didit::Types::SessionDecisionDecisionTraceActor? + def warning_counts: () -> Hash[String, Integer]? + def status_warnings: () -> Array[Didit::Types::SessionDecisionDecisionTraceStatusWarnings]? + end + + class SessionDecisionDecisionTraceActor < Didit::Model + def user: () -> String? + def actor_type: () -> String? + end + + class SessionDecisionDecisionTraceStatusWarnings < Didit::Model + def risk: () -> String? + def feature: () -> String? + def node_id: () -> String? + def log_type: () -> String? + def check_status: () -> String? + def source: () -> String? + def short_description: () -> String? + end + class SessionDecisionDocumentAiDocuments < Didit::Model def status: () -> String? def node_id: () -> String? @@ -8043,6 +8696,8 @@ module Didit def warnings: () -> Array[Didit::Types::SessionDecisionEmailVerificationsWarnings]? def lifecycle: () -> Array[Didit::Types::SessionDecisionEmailVerificationsLifecycle]? def matches: () -> Array[Didit::Types::SessionDecisionEmailVerificationsMatches]? + def email_intelligence: () -> Didit::Types::EmailIntelligence? + def email_social: () -> Didit::Types::EmailSocialFootprint? end class SessionDecisionEmailVerificationsBreaches < Didit::Model @@ -8117,6 +8772,31 @@ module Didit def source_image: () -> String? def target_image: () -> String? def warnings: () -> Array[Didit::Types::SessionDecisionFaceMatchesWarnings]? + def face_coverage: () -> Didit::Types::SessionDecisionFaceMatchesFaceCoverage? + end + + class SessionDecisionFaceMatchesFaceCoverage < Didit::Model + def eyes: () -> Didit::Types::SessionDecisionFaceMatchesFaceCoverageEyes? + def mouth: () -> Didit::Types::SessionDecisionFaceMatchesFaceCoverageMouth? + def face: () -> Didit::Types::SessionDecisionFaceMatchesFaceCoverageFace? + end + + class SessionDecisionFaceMatchesFaceCoverageEyes < Didit::Model + def covered: () -> bool? + def calibrated: () -> bool? + def visibility_score: () -> Float? + end + + class SessionDecisionFaceMatchesFaceCoverageFace < Didit::Model + def covered: () -> bool? + def calibrated: () -> bool? + def visibility_score: () -> Float? + end + + class SessionDecisionFaceMatchesFaceCoverageMouth < Didit::Model + def covered: () -> bool? + def calibrated: () -> bool? + def visibility_score: () -> Float? end class SessionDecisionFaceMatchesWarnings < Didit::Model @@ -8179,6 +8859,9 @@ module Didit def matches: () -> Array[Didit::Types::SessionDecisionIdVerificationsMatches]? def document_liveness: () -> Didit::Types::SessionDecisionIdVerificationsDocumentLiveness? def address_validation: () -> Didit::Types::AddressValidationResult? + def region: () -> String? + def extracted_data: () -> Hash[String, untyped]? + def barcodes: () -> Array[Hash[String, untyped]]? end class SessionDecisionIdVerificationsBackImageQualityScore < Didit::Model @@ -8461,6 +9144,14 @@ module Didit def poa_document: () -> Didit::Types::SessionDecisionIpAnalysesPoaDocument? def warnings: () -> Array[Didit::Types::SessionDecisionIpAnalysesWarnings]? def matches: () -> Array[Didit::Types::SessionDecisionIpAnalysesMatches]? + def browser_version: () -> String? + def os_version: () -> String? + def user_agent: () -> String? + def accept_language: () -> String? + def session_identifier: () -> String? + def session_age_ms: () -> Integer? + def coords_accuracy: () -> Float? + def raw_device_data: () -> Hash[String, untyped]? end class SessionDecisionIpAnalysesIdDocument < Didit::Model @@ -8709,6 +9400,44 @@ module Didit def pending: () -> Integer? end + class SessionDecisionLinkedRecords < Didit::Model + def same_face: () -> Didit::Types::SessionDecisionLinkedRecordsSameFace? + def earlier_verifications: () -> Didit::Types::SessionDecisionLinkedRecordsEarlierVerifications? + def networks: () -> Didit::Types::SessionDecisionLinkedRecordsNetworks? + end + + class SessionDecisionLinkedRecordsEarlierVerifications < Didit::Model + def count: () -> Integer? + def vendor_user_id: () -> String? + end + + class SessionDecisionLinkedRecordsNetworks < Didit::Model + def count: () -> Integer? + def open: () -> Integer? + def dismissed: () -> Integer? + def items: () -> Array[Didit::Types::SessionDecisionLinkedRecordsNetworksItems]? + end + + class SessionDecisionLinkedRecordsNetworksItems < Didit::Model + def network_id: () -> String? + def display_number: () -> Integer? + def name: () -> String? + def status: () -> String? + def risk_score: () -> Float? + end + + class SessionDecisionLinkedRecordsSameFace < Didit::Model + def count: () -> Integer? + def best_match: () -> Didit::Types::SessionDecisionLinkedRecordsSameFaceBestMatch? + end + + class SessionDecisionLinkedRecordsSameFaceBestMatch < Didit::Model + def session_id: () -> String? + def session_number: () -> Integer? + def vendor_user_id: () -> String? + def similarity_percentage: () -> Float? + end + class SessionDecisionLivenessChecks < Didit::Model def node_id: () -> String? def status: () -> String? @@ -8857,6 +9586,8 @@ module Didit def lifecycle: () -> Array[Didit::Types::SessionDecisionPhoneVerificationsLifecycle]? def warnings: () -> Array[Didit::Types::SessionDecisionPhoneVerificationsWarnings]? def matches: () -> Array[Didit::Types::SessionDecisionPhoneVerificationsMatches]? + def phone_intelligence: () -> Didit::Types::PhoneIntelligence? + def phone_social: () -> Didit::Types::PhoneSocialFootprint? end class SessionDecisionPhoneVerificationsCarrier < Didit::Model @@ -9057,7 +9788,7 @@ module Didit def node_id: () -> String? def data_resolved: () -> bool? def company: () -> Didit::Types::SessionDecisionRegistryChecksCompany? - def ownership_structure: () -> Hash[String, untyped]? + def ownership_structure: () -> Didit::Types::KYBOwnershipStructure? def warnings: () -> Array[Hash[String, untyped]]? end @@ -9102,7 +9833,7 @@ module Didit def addresses: () -> Array[Didit::Types::KYBRegistryAddress]? def industries: () -> Array[Didit::Types::KYBRegistryIndustry]? def accounts: () -> Hash[String, untyped]? - def registry_data: () -> Hash[String, untyped]? + def registry_data: () -> Didit::Types::KYBRegistryData? def user_provided_data: () -> Hash[String, untyped]? def confirmed_by_user_at: () -> Time? def last_console_edit_at: () -> Time? @@ -9111,6 +9842,7 @@ module Didit def registry_tier: () -> String? def registry_tier_delivered: () -> String? def registry_ownership_status: () -> String? + def registry_monitoring: () -> Didit::Types::SessionDecisionRegistryChecksCompanyRegistryMonitoring? end class SessionDecisionRegistryChecksCompanyBeneficialOwners < Didit::Model @@ -9158,6 +9890,19 @@ module Didit def date_of_birth_month: () -> Integer? end + class SessionDecisionRegistryChecksCompanyRegistryMonitoring < Didit::Model + def uuid: () -> String? + def status: () -> String? + def unavailable_reason: () -> String? + def enrolled_at: () -> Time? + def cancelled_at: () -> Time? + def last_bill_date: () -> Date? + def next_bill_date: () -> Date? + def last_event_at: () -> Time? + def events_count: () -> Integer? + def watched_fields: () -> untyped + end + class SessionDecisionResubmissions < Didit::Model def number: () -> Integer? def created_at: () -> Time? @@ -9186,6 +9931,11 @@ module Didit def created_at: () -> Time? end + class SessionDecisionStatusOverride < Didit::Model + def overridden_at: () -> Time? + def automatic_status: () -> String? + end + class SessionDeletionJob < Didit::Model def job_id: () -> String? def status: () -> String? @@ -9222,6 +9972,19 @@ module Didit def sent_at: () -> Integer end + class SessionFilesExport < Didit::Model + def export_id: () -> String + def session_id: () -> String + def status: () -> String + def file_count: () -> Integer? + def size_bytes: () -> Integer? + def download_url: () -> String? + def expires_at: () -> Time? + def error: () -> String? + def created_at: () -> Time + def completed_at: () -> Time? + end + class SessionImportError < Didit::Model def uuid: () -> String def row_number: () -> Integer @@ -10014,6 +10777,11 @@ module Didit def travel_rule: () -> Didit::Types::TravelRuleTransferDetail? end + class TravelRuleManualMatchResponse < Didit::Model + def deposit: () -> Didit::Types::TravelRuleTransferRow + def message: () -> Didit::Types::TravelRuleTransferRow + end + class TravelRuleMatchingRules < Didit::Model def individual: () -> Didit::Types::TravelRuleMatchingRulesIndividual? def company: () -> Didit::Types::TravelRuleMatchingRulesCompany? @@ -10695,6 +11463,7 @@ module Didit def available_events: () -> Array[Didit::Types::WebhookConfigAvailableEvents] def allowed_return_hosts: () -> Array[String] def endpoints: () -> Array[Didit::Types::WebhookConfigDestination] + def allowed_domains: () -> Array[String]? end class WebhookConfigAvailableEvents < Didit::Model @@ -10764,12 +11533,19 @@ module Didit def kyb_role_settings: () -> Array[Hash[String, untyped]]? def created_at: () -> Time? def updated_at: () -> Time? + def signature_availability: () -> Didit::Types::WorkflowDetailSignatureAvailability? def is_bank_verification_enabled: () -> bool? def bank_verification_config: () -> Hash[String, untyped]? def is_geolocation_enabled: () -> bool? def geolocation_config: () -> Hash[String, untyped]? end + class WorkflowDetailSignatureAvailability < Didit::Model + def simple: () -> bool? + def aes: () -> bool? + def qes: () -> bool? + end + class WorkflowListItem < Didit::Model def uuid: () -> String? def workflow_id: () -> String? diff --git a/sig/didit/types/database_validation.rbs b/sig/didit/types/database_validation.rbs index 713e9c1..c82a888 100644 --- a/sig/didit/types/database_validation.rbs +++ b/sig/didit/types/database_validation.rbs @@ -145,7 +145,7 @@ module Didit def long_description: () -> String? end - type database_validation_validate_params = { issuing_state: String, ?services: Array[String], ?validation_type: String, ?consent: bool, ?identification_number: String, ?first_name: String, ?last_name: String, ?middle_name: String, ?full_name: String, ?date_of_birth: Date | String, ?personal_number: String, ?tax_number: String, ?document_number: String, ?document_type: String, ?expiration_date: Date | String, ?date_of_issue: Date | String, ?nationality: String, ?gender: String, ?address: (Didit::Types::database_validation_validate_params_address_variant1 | String), ?address_element_1: String, ?address_element_2: String, ?address_element_3: String, ?address_element_4: String, ?address_element_5: String, ?postal_code: String, ?driver_license_number: String, ?driver_license_card_number: String, ?driver_license_state: String, ?driver_license_version: String, ?passport_number: String, ?passport_expiration_date: Date | String, ?passport_file_number: String, ?passport_issue_country: String, ?medicare_card_number: String, ?immi_card_number: String, ?immi_card_expiry_date: Date | String, ?citizenship_certificate_number: String, ?birth_registration_number: String, ?birth_registration_date: Date | String, ?birth_registration_state: String, ?marriage_certificate_number: String, ?change_of_name_certificate_number: String, ?first_partner_name: String, ?last_partner_name: String, ?voter_id: String, ?epic_card: String, ?pan: String, ?national_id: String, ?cic: String, ?identificador_ciudadano: String, ?ocr: String, ?voter_number: String, ?emission_number: String, ?bvn: String, ?bank_card_number: String, ?ssn: String, ?phone: String, ?landline: String, ?email: String, ?country_of_residence: String, ?partial_match_action: String, ?no_match_action: String, ?save_api_request: bool, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?selfie: Didit::upload } + type database_validation_validate_params = { issuing_state: String, ?services: Array[String], ?validation_type: String, ?consent: bool, ?identification_number: String, ?first_name: String, ?last_name: String, ?middle_name: String, ?full_name: String, ?date_of_birth: Date | String, ?personal_number: String, ?tax_number: String, ?document_number: String, ?document_type: String, ?expiration_date: Date | String, ?date_of_issue: Date | String, ?nationality: String, ?gender: String, ?address: (Didit::Types::database_validation_validate_params_address_variant1 | String), ?address_element_1: String, ?address_element_2: String, ?address_element_3: String, ?address_element_4: String, ?address_element_5: String, ?postal_code: String, ?driver_license_number: String, ?driver_license_card_number: String, ?driver_license_state: String, ?driver_license_version: String, ?passport_number: String, ?passport_expiration_date: Date | String, ?passport_file_number: String, ?passport_issue_country: String, ?medicare_card_number: String, ?immi_card_number: String, ?immi_card_expiry_date: Date | String, ?citizenship_certificate_number: String, ?birth_registration_number: String, ?birth_registration_date: Date | String, ?birth_registration_state: String, ?marriage_certificate_number: String, ?change_of_name_certificate_number: String, ?first_partner_name: String, ?last_partner_name: String, ?voter_id: String, ?epic_card: String, ?pan: String, ?national_id: String, ?cic: String, ?identificador_ciudadano: String, ?ocr: String, ?voter_number: String, ?emission_number: String, ?bvn: String, ?bank_card_number: String, ?company_registration_number: String, ?company_name: String, ?initials: String, ?licence_number: String, ?refugee_file_number: String, ?bank_name: String, ?bank_account_number: String, ?account_type: String, ?phone_number: String, ?right_thumb: String, ?left_thumb: String, ?score_level: Integer, ?max_matches: Integer, ?vehicle_register_number: String, ?vehicle_licence_plate: String, ?vin: String, ?ssn: String, ?phone: String, ?landline: String, ?email: String, ?country_of_residence: String, ?partial_match_action: String, ?no_match_action: String, ?save_api_request: bool, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?selfie: Didit::upload } type database_validation_validate_params_address_variant1 = { ?street_1: String, ?street_2: String, ?city: String, ?region: String, ?postal_code: String, ?country: String } end diff --git a/sig/didit/types/email.rbs b/sig/didit/types/email.rbs index 17ed202..b52e894 100644 --- a/sig/didit/types/email.rbs +++ b/sig/didit/types/email.rbs @@ -23,6 +23,13 @@ module Didit VALUES: Array[String] end + module EmailCheckCodeParamsEmailIntelligenceScoreAction + NO_ACTION: String + DECLINE: String + + VALUES: Array[String] + end + module EmailCheckCodeParamsEmailNoSocialPresenceAction NO_ACTION: String DECLINE: String @@ -30,6 +37,20 @@ module Didit VALUES: Array[String] end + module EmailCheckCodeParamsFrequentEmailBreachAction + NO_ACTION: String + DECLINE: String + + VALUES: Array[String] + end + + module EmailCheckCodeParamsRecentEmailBreachAction + NO_ACTION: String + DECLINE: String + + VALUES: Array[String] + end + module EmailSendCodeParamsOptionsLocale EN: String AR: String @@ -101,7 +122,7 @@ module Didit type email_assess_risk_params = { email: String, ?country_code: String, ?signals: Didit::Types::risk_signals, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?enable_social: bool } - type email_check_code_params = { email: String, code: String, ?duplicated_email_action: String, ?breached_email_action: String, ?disposable_email_action: String, ?enable_social: bool, ?email_no_social_presence_action: String } + type email_check_code_params = { email: String, code: String, ?duplicated_email_action: String, ?breached_email_action: String, ?disposable_email_action: String, ?enable_enrichment: bool, ?email_intelligence_score_action: String, ?recent_email_breach_action: String, ?frequent_email_breach_action: String, ?enable_social: bool, ?email_no_social_presence_action: String } type email_send_code_params = { email: String, ?options: Didit::Types::email_send_code_params_options, ?signals: Didit::Types::email_send_code_params_signals, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])? } diff --git a/sig/didit/types/id_wallets.rbs b/sig/didit/types/id_wallets.rbs index bfe6d32..733278d 100644 --- a/sig/didit/types/id_wallets.rbs +++ b/sig/didit/types/id_wallets.rbs @@ -26,6 +26,8 @@ module Didit type id_wallets_start_ftn_params = { ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, return_url: String, ?device: String } + type id_wallets_start_google_wallet_params = { ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, country: String, origin: String } + type id_wallets_start_govbr_params = { ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, return_url: String, ?device: String } type id_wallets_start_govuk_wallet_params = { ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, return_url: String, ?device: String } @@ -51,5 +53,7 @@ module Didit type id_wallets_start_uae_pass_params = { ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, return_url: String, ?device: String } type id_wallets_start_vipps_params = { ?vendor_data: String?, ?metadata: (Hash[String | Symbol, untyped])?, ?sandbox_scenario: String, ?country: String, return_url: String, ?device: String } + + type id_wallets_submit_verification_response_params = { response: Hash[String | Symbol, untyped] } end end diff --git a/sig/didit/types/kyb.rbs b/sig/didit/types/kyb.rbs index c098fde..be56312 100644 --- a/sig/didit/types/kyb.rbs +++ b/sig/didit/types/kyb.rbs @@ -761,7 +761,7 @@ module Didit def addresses: () -> Array[Didit::Types::KYBRegistryAddress]? def industries: () -> Array[Didit::Types::KYBRegistryIndustry]? def accounts: () -> Hash[String, untyped]? - def registry_data: () -> Hash[String, untyped]? + def registry_data: () -> Didit::Types::KYBRegistryData? def user_provided_data: () -> Hash[String, untyped]? def confirmed_by_user_at: () -> Time? def last_console_edit_at: () -> Time? @@ -770,6 +770,7 @@ module Didit def registry_ownership_status: () -> String? def ownership: () -> Didit::Types::KYBRegistryOwnership? def registry_tier: () -> String? + def registry_monitoring: () -> Didit::Types::KybListShareholdersResponse202KybRegistryRegistryMonitoring? end class KybListShareholdersResponse202KybRegistryBeneficialOwners < Didit::Model @@ -817,6 +818,19 @@ module Didit def date_of_birth_month: () -> Integer? end + class KybListShareholdersResponse202KybRegistryRegistryMonitoring < Didit::Model + def uuid: () -> String? + def status: () -> String? + def unavailable_reason: () -> String? + def enrolled_at: () -> Time? + def cancelled_at: () -> Time? + def last_bill_date: () -> Date? + def next_bill_date: () -> Date? + def last_event_at: () -> Time? + def events_count: () -> Integer? + def watched_fields: () -> untyped + end + class KybListShareholdersResponseKybRegistry < Didit::Model def uuid: () -> String? def node_id: () -> String? @@ -858,7 +872,7 @@ module Didit def addresses: () -> Array[Didit::Types::KYBRegistryAddress]? def industries: () -> Array[Didit::Types::KYBRegistryIndustry]? def accounts: () -> Hash[String, untyped]? - def registry_data: () -> Hash[String, untyped]? + def registry_data: () -> Didit::Types::KYBRegistryData? def user_provided_data: () -> Hash[String, untyped]? def confirmed_by_user_at: () -> Time? def last_console_edit_at: () -> Time? @@ -867,6 +881,7 @@ module Didit def registry_ownership_status: () -> String? def ownership: () -> Didit::Types::KYBRegistryOwnership? def registry_tier: () -> String? + def registry_monitoring: () -> Didit::Types::KybListShareholdersResponseKybRegistryRegistryMonitoring? end class KybListShareholdersResponseKybRegistryBeneficialOwners < Didit::Model @@ -914,6 +929,19 @@ module Didit def date_of_birth_month: () -> Integer? end + class KybListShareholdersResponseKybRegistryRegistryMonitoring < Didit::Model + def uuid: () -> String? + def status: () -> String? + def unavailable_reason: () -> String? + def enrolled_at: () -> Time? + def cancelled_at: () -> Time? + def last_bill_date: () -> Date? + def next_bill_date: () -> Date? + def last_event_at: () -> Time? + def events_count: () -> Integer? + def watched_fields: () -> untyped + end + class KybListUbosResponse < Didit::Model def request_id: () -> String? def registry_tier_requested: () -> String? @@ -975,7 +1003,7 @@ module Didit def addresses: () -> Array[Didit::Types::KYBRegistryAddress]? def industries: () -> Array[Didit::Types::KYBRegistryIndustry]? def accounts: () -> Hash[String, untyped]? - def registry_data: () -> Hash[String, untyped]? + def registry_data: () -> Didit::Types::KYBRegistryData? def user_provided_data: () -> Hash[String, untyped]? def confirmed_by_user_at: () -> Time? def last_console_edit_at: () -> Time? @@ -984,6 +1012,7 @@ module Didit def registry_ownership_status: () -> String? def ownership: () -> Didit::Types::KYBRegistryOwnership? def registry_tier: () -> String? + def registry_monitoring: () -> Didit::Types::KybListUbosResponse202KybRegistryRegistryMonitoring? end class KybListUbosResponse202KybRegistryBeneficialOwners < Didit::Model @@ -1031,6 +1060,19 @@ module Didit def date_of_birth_month: () -> Integer? end + class KybListUbosResponse202KybRegistryRegistryMonitoring < Didit::Model + def uuid: () -> String? + def status: () -> String? + def unavailable_reason: () -> String? + def enrolled_at: () -> Time? + def cancelled_at: () -> Time? + def last_bill_date: () -> Date? + def next_bill_date: () -> Date? + def last_event_at: () -> Time? + def events_count: () -> Integer? + def watched_fields: () -> untyped + end + class KybListUbosResponseKybRegistry < Didit::Model def uuid: () -> String? def node_id: () -> String? @@ -1072,7 +1114,7 @@ module Didit def addresses: () -> Array[Didit::Types::KYBRegistryAddress]? def industries: () -> Array[Didit::Types::KYBRegistryIndustry]? def accounts: () -> Hash[String, untyped]? - def registry_data: () -> Hash[String, untyped]? + def registry_data: () -> Didit::Types::KYBRegistryData? def user_provided_data: () -> Hash[String, untyped]? def confirmed_by_user_at: () -> Time? def last_console_edit_at: () -> Time? @@ -1081,6 +1123,7 @@ module Didit def registry_ownership_status: () -> String? def ownership: () -> Didit::Types::KYBRegistryOwnership? def registry_tier: () -> String? + def registry_monitoring: () -> Didit::Types::KybListUbosResponseKybRegistryRegistryMonitoring? end class KybListUbosResponseKybRegistryBeneficialOwners < Didit::Model @@ -1128,6 +1171,19 @@ module Didit def date_of_birth_month: () -> Integer? end + class KybListUbosResponseKybRegistryRegistryMonitoring < Didit::Model + def uuid: () -> String? + def status: () -> String? + def unavailable_reason: () -> String? + def enrolled_at: () -> Time? + def cancelled_at: () -> Time? + def last_bill_date: () -> Date? + def next_bill_date: () -> Date? + def last_event_at: () -> Time? + def events_count: () -> Integer? + def watched_fields: () -> untyped + end + class KybSearchResponse < Didit::Model def request_id: () -> String? def kyb_registry: () -> Didit::Types::KYBRegistrySearchResults? @@ -1187,7 +1243,7 @@ module Didit def addresses: () -> Array[Didit::Types::KYBRegistryAddress]? def industries: () -> Array[Didit::Types::KYBRegistryIndustry]? def accounts: () -> Hash[String, untyped]? - def registry_data: () -> Hash[String, untyped]? + def registry_data: () -> Didit::Types::KYBRegistryData? def user_provided_data: () -> Hash[String, untyped]? def confirmed_by_user_at: () -> Time? def last_console_edit_at: () -> Time? @@ -1196,6 +1252,7 @@ module Didit def registry_ownership_status: () -> String? def ownership: () -> Didit::Types::KYBRegistryOwnership? def registry_tier: () -> String? + def registry_monitoring: () -> Didit::Types::KybSelectResponseKybRegistryRegistryMonitoring? end class KybSelectResponseKybRegistryBeneficialOwners < Didit::Model @@ -1243,6 +1300,19 @@ module Didit def date_of_birth_month: () -> Integer? end + class KybSelectResponseKybRegistryRegistryMonitoring < Didit::Model + def uuid: () -> String? + def status: () -> String? + def unavailable_reason: () -> String? + def enrolled_at: () -> Time? + def cancelled_at: () -> Time? + def last_bill_date: () -> Date? + def next_bill_date: () -> Date? + def last_event_at: () -> Time? + def events_count: () -> Integer? + def watched_fields: () -> untyped + end + type kyb_list_shareholders_params = { kyb_response_id: String, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?save_api_request: bool } type kyb_list_ubos_params = { kyb_response_id: String, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?save_api_request: bool } diff --git a/sig/didit/types/phone.rbs b/sig/didit/types/phone.rbs index b0e8793..a9ec277 100644 --- a/sig/didit/types/phone.rbs +++ b/sig/didit/types/phone.rbs @@ -16,6 +16,20 @@ module Didit VALUES: Array[String] end + module PhoneCheckCodeParamsLowPhoneTrustAction + NO_ACTION: String + DECLINE: String + + VALUES: Array[String] + end + + module PhoneCheckCodeParamsPhoneIntelligenceScoreAction + NO_ACTION: String + DECLINE: String + + VALUES: Array[String] + end + module PhoneCheckCodeParamsPhoneNoSocialPresenceAction NO_ACTION: String DECLINE: String @@ -23,6 +37,20 @@ module Didit VALUES: Array[String] end + module PhoneCheckCodeParamsPhoneTypeRiskAction + NO_ACTION: String + DECLINE: String + + VALUES: Array[String] + end + + module PhoneCheckCodeParamsRecentPortAction + NO_ACTION: String + DECLINE: String + + VALUES: Array[String] + end + module PhoneCheckCodeParamsVoipNumberAction NO_ACTION: String DECLINE: String @@ -54,7 +82,7 @@ module Didit type phone_assess_risk_params = { phone_number: String, ?country_code: String, ?signals: Didit::Types::risk_signals, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])?, ?enable_social: bool } - type phone_check_code_params = { phone_number: String, code: String, ?duplicated_phone_number_action: String, ?disposable_number_action: String, ?voip_number_action: String, ?enable_social: bool, ?phone_no_social_presence_action: String } + type phone_check_code_params = { phone_number: String, code: String, ?duplicated_phone_number_action: String, ?disposable_number_action: String, ?voip_number_action: String, ?enable_enrichment: bool, ?phone_intelligence_score_action: String, ?phone_type_risk_action: String, ?recent_port_action: String, ?low_phone_trust_action: String, ?enable_social: bool, ?phone_no_social_presence_action: String } type phone_send_code_params = { phone_number: String, ?options: Didit::Types::phone_send_code_params_options, ?signals: Didit::Types::phone_send_code_params_signals, ?vendor_data: String, ?metadata: (Hash[String | Symbol, untyped])? } diff --git a/sig/didit/types/sessions.rbs b/sig/didit/types/sessions.rbs index e7a85b7..c8dc276 100644 --- a/sig/didit/types/sessions.rbs +++ b/sig/didit/types/sessions.rbs @@ -35,6 +35,108 @@ module Didit VALUES: Array[String] end + module SessionsCreateKybPartyDraftParamsEntityType + PERSON: String + COMPANY: String + + VALUES: Array[String] + end + + module SessionsCreateKybPartyDraftParamsRole + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + + module SessionsCreateKybPartyDraftParamsRoles + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + + module SessionsCreateKybPartyDraftResponsePartyEntityType + PERSON: String + COMPANY: String + + VALUES: Array[String] + end + + module SessionsCreateKybPartyDraftResponsePartyRole + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + + module SessionsCreateKybPartyDraftResponsePartyRoles + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + module SessionsCreateParamsCallbackMethod INITIATOR: String COMPLETER: String @@ -314,6 +416,86 @@ module Didit VALUES: Array[String] end + module SessionsListKybExtractedPartiesResponsePartiesEntityType + PERSON: String + COMPANY: String + + VALUES: Array[String] + end + + module SessionsListKybExtractedPartiesResponsePartiesRolesRole + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + + module SessionsListKybPartyDraftsResponsePartiesPartyEntityType + PERSON: String + COMPANY: String + + VALUES: Array[String] + end + + module SessionsListKybPartyDraftsResponsePartiesPartyRole + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + + module SessionsListKybPartyDraftsResponsePartiesPartyRoles + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + module SessionsListParamsApiService ID_VERIFICATION: String FACE_MATCH: String @@ -362,6 +544,7 @@ module Didit IP_ANALYSIS: String AGE_ESTIMATION: String DATABASE_VALIDATION: String + GEOLOCATION: String VALUES: Array[String] end @@ -453,6 +636,7 @@ module Didit KYB_REGISTRY: String KYB_KEY_PEOPLE: String KYB: String + GEOLOCATION: String VALUES: Array[String] end @@ -482,6 +666,7 @@ module Didit KYB_REGISTRY: String KYB_KEY_PEOPLE: String KYB: String + GEOLOCATION: String VALUES: Array[String] end @@ -792,6 +977,108 @@ module Didit VALUES: Array[String] end + module SessionsUpdateKybPartyDraftParamsEntityType + PERSON: String + COMPANY: String + + VALUES: Array[String] + end + + module SessionsUpdateKybPartyDraftParamsRole + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + + module SessionsUpdateKybPartyDraftParamsRoles + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + + module SessionsUpdateKybPartyDraftResponsePartyEntityType + PERSON: String + COMPANY: String + + VALUES: Array[String] + end + + module SessionsUpdateKybPartyDraftResponsePartyRole + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + + module SessionsUpdateKybPartyDraftResponsePartyRoles + DIRECTOR: String + NON_EXECUTIVE_DIRECTOR: String + SECRETARY: String + CHAIRMAN: String + UBO: String + SHAREHOLDER: String + REPRESENTATIVE: String + FOUNDER: String + LEGAL_ADVISOR: String + AUTHORIZED_SIGNATORY: String + TRUSTEE: String + BENEFICIARY: String + SETTLOR: String + PROTECTOR: String + COMPANY_OFFICER: String + INVESTOR: String + OTHER: String + + VALUES: Array[String] + end + module SessionsUpdateKybPartyResponseEntityType PERSON: String COMPANY: String @@ -852,6 +1139,16 @@ module Didit KYB_REGISTRY: String KYB_KEY_PEOPLE: String KYB: String + GEOLOCATION: String + + VALUES: Array[String] + end + + module SessionsUploadKybDocumentsParamsDocumentGroup + LEGAL_PRESENCE: String + COMPANY_DETAILS: String + OWNERSHIP_STRUCTURE: String + REPRESENTATIVES_AUTHORIZATION: String VALUES: Array[String] end @@ -878,6 +1175,32 @@ module Didit def updated_hits: () -> Array[String] end + class SessionsCreateKybPartyDraftResponse < Didit::Model + def draft_id: () -> String + def created_at: () -> Time + def updated_at: () -> Time + def party: () -> Didit::Types::SessionsCreateKybPartyDraftResponseParty + end + + class SessionsCreateKybPartyDraftResponseParty < Didit::Model + def entity_type: () -> String + def full_name: () -> String? + def first_name: () -> String? + def last_name: () -> String? + def role: () -> String? + def roles: () -> Array[String]? + def position: () -> String? + def date_of_birth: () -> Date? + def company_name: () -> String? + def registration_number: () -> String? + def email: () -> String? + def ownership_percent: () -> Float? + def nationality: () -> String + def phone_number: () -> String? + def custom_fields: () -> Hash[String, untyped]? + def skip_verification: () -> bool? + end + class SessionsCreateResponse < Didit::Model def session_id: () -> String def session_number: () -> Integer @@ -958,6 +1281,73 @@ module Didit def overrides: () -> Array[Didit::Types::FeatureStatusOverride] end + class SessionsListKybExtractedPartiesResponse < Didit::Model + def parties: () -> Array[Didit::Types::SessionsListKybExtractedPartiesResponseParties] + def document_count: () -> Integer + def node_id: () -> String? + end + + class SessionsListKybExtractedPartiesResponseParties < Didit::Model + def name: () -> String? + def entity_type: () -> String? + def first_name: () -> String? + def last_name: () -> String? + def appointment_date: () -> String? + def designation: () -> String? + def roles: () -> Array[Didit::Types::SessionsListKybExtractedPartiesResponsePartiesRoles]? + def documents: () -> Array[Didit::Types::SessionsListKybExtractedPartiesResponsePartiesDocuments]? + end + + class SessionsListKybExtractedPartiesResponsePartiesDocuments < Didit::Model + def document_uuid: () -> String? + def document_type: () -> String? + def document_subtype: () -> String? + def original_filename: () -> String? + def status: () -> String? + end + + class SessionsListKybExtractedPartiesResponsePartiesRoles < Didit::Model + def role: () -> String? + def ownership_percent: () -> Didit::Types::SessionsListKybExtractedPartiesResponsePartiesRolesOwnershipPercent? + end + + class SessionsListKybExtractedPartiesResponsePartiesRolesOwnershipPercent < Didit::Model + def text: () -> String? + def min: () -> Float? + def max: () -> Float? + end + + class SessionsListKybPartyDraftsResponse < Didit::Model + def parties: () -> Array[Didit::Types::SessionsListKybPartyDraftsResponseParties]? + def node_id: () -> String? + end + + class SessionsListKybPartyDraftsResponseParties < Didit::Model + def draft_id: () -> String + def created_at: () -> Time + def updated_at: () -> Time + def party: () -> Didit::Types::SessionsListKybPartyDraftsResponsePartiesParty + end + + class SessionsListKybPartyDraftsResponsePartiesParty < Didit::Model + def entity_type: () -> String + def full_name: () -> String? + def first_name: () -> String? + def last_name: () -> String? + def role: () -> String? + def roles: () -> Array[String]? + def position: () -> String? + def date_of_birth: () -> Date? + def company_name: () -> String? + def registration_number: () -> String? + def email: () -> String? + def ownership_percent: () -> Float? + def nationality: () -> String + def phone_number: () -> String? + def custom_fields: () -> Hash[String, untyped]? + def skip_verification: () -> bool? + end + class SessionsListResponse < Didit::Model def count: () -> Integer def `next`: () -> String? @@ -982,6 +1372,11 @@ module Didit def phone_number: () -> Didit::Types::SessionsListResponseResultsPhoneNumber? def email_address: () -> Didit::Types::SessionsListResponseResultsEmailAddress? def additional_details: () -> Didit::Types::SessionsListResponseResultsAdditionalDetails? + def assignee: () -> Didit::Types::SessionsListResponseResultsAssignee? + def waiting_since: () -> Time? + def sla_due_at: () -> Time? + def top_warnings: () -> Array[Didit::Types::SessionsListResponseResultsTopWarnings]? + def warnings_count: () -> Integer? def workflow_id: () -> String? def workflow_type: () -> String? def workflow_label: () -> String? @@ -1050,6 +1445,11 @@ module Didit def name_on_document: () -> String? end + class SessionsListResponseResultsAssignee < Didit::Model + def email: () -> String? + def assigned_at: () -> Time? + end + class SessionsListResponseResultsEmailAddress < Didit::Model def email: () -> String def is_verified: () -> bool @@ -1065,6 +1465,13 @@ module Didit def is_verified: () -> bool end + class SessionsListResponseResultsTopWarnings < Didit::Model + def risk: () -> String? + def feature: () -> String? + def log_type: () -> String? + def short_description: () -> String? + end + class SessionsPreviewDecisionEmailResponse < Didit::Model def recipient: () -> String def recipient_source: () -> String @@ -1074,6 +1481,7 @@ module Didit def sender_kind: () -> String def subject: () -> String def html: () -> String + def text: () -> String def language: () -> String def will_be_sent: () -> bool def not_sent_reason: () -> String? @@ -1089,6 +1497,7 @@ module Didit def sender_kind: () -> String def subject: () -> String def html: () -> String + def text: () -> String def language: () -> String def will_be_sent: () -> bool def not_sent_reason: () -> String? @@ -1126,6 +1535,16 @@ module Didit def signatures: () -> Array[Didit::Types::SignatureResult]? end + class SessionsSubmitKybPartiesResponse < Didit::Model + def valid: () -> bool? + def next_step: () -> String? + def status: () -> String? + def advanced: () -> bool? + def already_submitted: () -> bool? + def kyb_key_people_status: () -> String? + def parties: () -> Array[Didit::Types::KYBKeyPeopleParty]? + end + class SessionsUpdateAmlHitStatusResponse < Didit::Model def message: () -> String def hit_id: () -> String @@ -1227,13 +1646,39 @@ module Didit def addresses: () -> Array[Hash[String, untyped]]? def industries: () -> Array[Hash[String, untyped]]? def accounts: () -> Hash[String, untyped]? - def registry_data: () -> Hash[String, untyped]? + def registry_data: () -> Didit::Types::KYBRegistryData? def user_provided_data: () -> Hash[String, untyped]? def confirmed_by_user_at: () -> Time? def last_console_edit_at: () -> Time? def is_editable: () -> bool? end + class SessionsUpdateKybPartyDraftResponse < Didit::Model + def draft_id: () -> String + def created_at: () -> Time + def updated_at: () -> Time + def party: () -> Didit::Types::SessionsUpdateKybPartyDraftResponseParty + end + + class SessionsUpdateKybPartyDraftResponseParty < Didit::Model + def entity_type: () -> String + def full_name: () -> String? + def first_name: () -> String? + def last_name: () -> String? + def role: () -> String? + def roles: () -> Array[String]? + def position: () -> String? + def date_of_birth: () -> Date? + def company_name: () -> String? + def registration_number: () -> String? + def email: () -> String? + def ownership_percent: () -> Float? + def nationality: () -> String + def phone_number: () -> String? + def custom_fields: () -> Hash[String, untyped]? + def skip_verification: () -> bool? + end + class SessionsUpdateKybPartyResponse < Didit::Model def uuid: () -> String? def entity_type: () -> String? @@ -1274,6 +1719,13 @@ module Didit def session_id: () -> String? end + class SessionsUploadKybDocumentsResponse < Didit::Model + def valid: () -> bool? + def next_step: () -> String? + def kyb_status: () -> String? + def document_answer: () -> Hash[String, untyped]? + end + type sessions_add_images_params = { file: Didit::upload, model_type: String, ?file_password: String } type sessions_batch_delete_params = { ?session_numbers: Array[String], ?delete_all: bool, ?retain_face_embeddings: bool?, ?face_retention_days: Integer, ?face_retention_deadline: Time | String, ?deletion_instruction: String, ?instruction_id: String, ?filter_status: (String | Array[String]), ?filter_vendor_data: String, ?filter_search: String, ?filter_workflow_id: (String | Array[String]), ?filter_date_from: Date | String, ?filter_date_to: Date | String, ?filter_country: (String | Array[String]), ?filter_document_type: (String | Array[String]), ?filter_document_name: (String | Array[String]), ?filter_region: (String | Array[String]), ?filter_didit_internal_id: String, ?filter_session_type: (String | Array[String]), ?filter_api_service: String, ?filter_screened_full_name: String, ?filter_warning: (String | Array[String]), ?filter_status_initialized_as_in_review: bool, ?filter_is_kyc_to_be_reviewed: bool, ?filter_euuid: String, ?filter_organization_name: (String | Array[String]) } @@ -1282,7 +1734,9 @@ module Didit type sessions_bulk_update_aml_hit_status_params_hit_updates = { hit_id: String, review_status: String } - type sessions_create_params = { workflow_id: String, ?vendor_data: String, ?callback: String, ?callback_method: String, ?metadata: untyped, ?tags: Array[String], ?language: String, ?contact_details: Didit::Types::sessions_create_params_contact_details, ?expected_details: Didit::Types::sessions_create_params_expected_details, ?portrait_image: String, ?sandbox_scenario: String, ?sign: Didit::Types::sessions_create_params_sign, ?user_state: String, ?biometric_consent: Didit::Types::sessions_create_params_biometric_consent } + type sessions_create_kyb_party_draft_params = { entity_type: String, ?full_name: String, ?first_name: String, ?last_name: String, ?role: String, ?roles: Array[String], ?position: String, ?date_of_birth: (Date | String)?, ?company_name: String, ?registration_number: String, ?email: String, ?ownership_percent: (Float | Integer)?, nationality: String, ?phone_number: String, ?custom_fields: Hash[String | Symbol, untyped], ?skip_verification: bool } + + type sessions_create_params = { workflow_id: String, ?vendor_data: String, ?multi_account_segment: String, ?callback: String, ?callback_method: String, ?metadata: untyped, ?tags: Array[String], ?language: String, ?contact_details: Didit::Types::sessions_create_params_contact_details, ?expected_details: Didit::Types::sessions_create_params_expected_details, ?portrait_image: String, ?sandbox_scenario: String, ?sign: Didit::Types::sessions_create_params_sign, ?user_state: String, ?biometric_consent: Didit::Types::sessions_create_params_biometric_consent } type sessions_create_params_biometric_consent = { given_at: Time | String, text_version: String } @@ -1322,6 +1776,8 @@ module Didit type sessions_simulate_params = { ?new_status: String, ?comment: String, ?scenario: String, ?risk: String, ?node_id: String, ?send_webhooks: bool } + type sessions_submit_kyb_parties_params = { ?locale: String } + type sessions_update_aml_hit_status_params = { hit_id: String, review_status: String, ?node_id: String } type sessions_update_aml_status_params = { status: String, ?node_id: String } @@ -1336,6 +1792,8 @@ module Didit type sessions_update_kyb_company_data_params = { ?company_name: String, ?registration_number: String, ?country_code: String, ?region: String?, ?incorporation_date: Date | String, ?registration_date: (Date | String)?, ?dissolution_date: (Date | String)?, ?tax_number: String, ?legal_address: String, ?company_type: String, ?registry_status: String?, ?verification_status: String?, ?alternative_names: String, ?nature_of_business: String, ?registered_capital: String, ?registered_capital_amount: (Float | Integer)?, ?registered_capital_currency: String?, ?website: String, ?email: String, ?phone: String, ?legal_entity_identifier: String, ?location_of_registration: String, ?vat_number: String, ?control_scheme: String } + type sessions_update_kyb_party_draft_params = { ?entity_type: String, ?full_name: String, ?first_name: String, ?last_name: String, ?role: String, ?roles: Array[String], ?position: String, ?date_of_birth: (Date | String)?, ?company_name: String, ?registration_number: String, ?email: String, ?ownership_percent: (Float | Integer)?, ?nationality: String, ?phone_number: String, ?custom_fields: Hash[String | Symbol, untyped], ?skip_verification: bool } + type sessions_update_kyb_party_params = { is_skipped: bool } type sessions_update_poa_data_params = { ?issuing_state: String?, ?document_type: String, ?document_language: String?, ?issuer: String?, ?issue_date: (Date | String)?, ?poa_address: String?, ?name_on_document: String?, ?extra_fields: (Hash[String | Symbol, untyped])?, ?poa_parsed_address: Didit::Types::sessions_update_poa_data_params_poa_parsed_address? } @@ -1345,5 +1803,7 @@ module Didit type sessions_update_status_params = { new_status: String, ?comment: String, ?nodes_to_resubmit: Array[Didit::Types::sessions_update_status_params_nodes_to_resubmit], ?send_email: bool, ?email_address: String, ?email_language: String, ?email_preview_token: String } type sessions_update_status_params_nodes_to_resubmit = { node_id: String, feature: String } + + type sessions_upload_kyb_documents_params = { documents: Array[Didit::upload], ?document_passwords: Array[String], ?document_group: String, ?locale: String } end end diff --git a/sig/didit/types/travel_rule.rbs b/sig/didit/types/travel_rule.rbs index 5f1c2e3..87d1299 100644 --- a/sig/didit/types/travel_rule.rbs +++ b/sig/didit/types/travel_rule.rbs @@ -137,6 +137,13 @@ module Didit def results: () -> Array[Didit::Types::TravelRuleTransferRow]? end + class TravelRuleUnmatchedDepositsListResponse < Didit::Model + def count: () -> Integer? + def `next`: () -> String? + def previous: () -> String? + def results: () -> Array[Didit::Types::TravelRuleTransferRow]? + end + class TravelRuleWalletAddressesListResponse < Didit::Model def count: () -> Integer? def `next`: () -> String? @@ -167,6 +174,8 @@ module Didit type travel_rule_send_vasp_questionnaire_params = { ?sent_to: String } + type travel_rule_unmatched_deposits_match_params = { transaction_id: String } + type travel_rule_update_settings_params = { ?is_enabled: bool, ?legal_name: String, ?lei: String, ?jurisdiction: String, ?name_matching_strictness: String, ?confirmation_timeout_hours: Integer, ?timeout_outcome: String, ?compliance_email: String, ?is_discoverable: bool, ?threshold_amount: String, ?ownership_validation_mode: String, ?simplified_validation_threshold: String, ?data_sharing_fields: Didit::Types::travel_rule_data_sharing_fields, ?matching_rules: Didit::Types::travel_rule_matching_rules, ?inbound_auto_accept: bool, ?allow_self_declaration: bool, ?allow_screenshot_proof: bool, ?auto_wallet_verification: bool, ?vasp_attribution_enabled: bool, ?counterparty_screening_enabled: bool, ?sunrise_policy: String, ?non_responsive_policy: String, ?disabled_networks: Array[String] } type travel_rule_update_vasp_decision_params = { decision: String, ?reason: String } diff --git a/sig/didit/types/users.rbs b/sig/didit/types/users.rbs index ef4947f..f648ed1 100644 --- a/sig/didit/types/users.rbs +++ b/sig/didit/types/users.rbs @@ -164,7 +164,7 @@ module Didit def created_at: () -> Time end - type users_batch_delete_params = { ?vendor_data_list: Array[String], ?didit_internal_id_list: Array[String], ?delete_all: bool } + type users_batch_delete_params = { ?vendor_data_list: Array[String], ?didit_internal_id_list: Array[String], ?delete_all: bool, ?retain_face_embeddings: bool, ?face_retention_days: Integer } type users_create_params = { vendor_data: String, ?full_name: String?, ?display_name: String?, ?date_of_birth: (Date | String)?, ?status: String, ?metadata: (Hash[String | Symbol, untyped])?, ?approved_emails: Array[String], ?approved_phones: Array[String], ?issuing_states: Array[String], ?first_name: String, ?last_name: String, ?email: String, ?phone_number: String, ?country: String, ?send_verification_link: bool, ?workflow_id: String, ?language: String } diff --git a/sig/didit/types/wallet_screening.rbs b/sig/didit/types/wallet_screening.rbs index 449c3b6..481acaf 100644 --- a/sig/didit/types/wallet_screening.rbs +++ b/sig/didit/types/wallet_screening.rbs @@ -19,6 +19,10 @@ module Didit BASE: String OP: String ARB: String + AVAX: String + ADA: String + XLM: String + HBAR: String CELO: String MODE: String PLUME: String @@ -35,6 +39,6 @@ module Didit VALUES: Array[String] end - type wallet_screening_screen_params = { wallet_address: String, blockchain: String, ?direction: String } + type wallet_screening_screen_params = { wallet_address: String, ?blockchain: String, ?direction: String } end end diff --git a/sig/didit/types/webhooks.rbs b/sig/didit/types/webhooks.rbs index c3b983f..a668cec 100644 --- a/sig/didit/types/webhooks.rbs +++ b/sig/didit/types/webhooks.rbs @@ -306,6 +306,6 @@ module Didit type webhooks_destinations_update_params = { ?label: String, ?url: String, ?enabled: bool, ?webhook_version: String, ?subscribed_events: Array[String] } - type webhooks_update_config_params = { ?webhook_url: String?, ?webhook_version: String, ?rotate_secret_key: bool, ?capture_method: String, ?data_retention_months: Integer?, ?face_retention_policy: String, ?face_retention_days: Integer?, ?biometric_consent_mode: String, ?allowed_return_hosts: Array[String] } + type webhooks_update_config_params = { ?webhook_url: String?, ?webhook_version: String, ?rotate_secret_key: bool, ?capture_method: String, ?data_retention_months: Integer?, ?face_retention_policy: String, ?face_retention_days: Integer?, ?biometric_consent_mode: String, ?allowed_return_hosts: Array[String], ?allowed_domains: Array[String] } end end diff --git a/spec/generated/aml_spec.rb b/spec/generated/aml_spec.rb index e9baf3f..4d13bfe 100644 --- a/spec/generated/aml_spec.rb +++ b/spec/generated/aml_spec.rb @@ -73,6 +73,11 @@ JSON result = client.aml.screen( full_name: "Antonio Ejemplo Modelo", + entity_type: "person", + date_of_birth: "1972-02-29", + nationality: "ES", + include_adverse_media: false, + vendor_data: "user-1234", idempotency_key: "idem-key-1" ) request = expect_api_request( @@ -84,7 +89,12 @@ accept: "application/json" ) expect_json_body(request, { - "full_name" => "Antonio Ejemplo Modelo" + "full_name" => "Antonio Ejemplo Modelo", + "entity_type" => "person", + "date_of_birth" => "1972-02-29", + "nationality" => "ES", + "include_adverse_media" => false, + "vendor_data" => "user-1234" }) expect(request.headers["Idempotency-Key"]).to eq("idem-key-1") expect(result).to be_a(Didit::Types::AmlScreenResponse) diff --git a/spec/generated/analytics_spec.rb b/spec/generated/analytics_spec.rb index 6333d45..4531788 100644 --- a/spec/generated/analytics_spec.rb +++ b/spec/generated/analytics_spec.rb @@ -434,4 +434,94 @@ expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) end + + it "analytics.retrieve_today sends GET /v3/organization/{organization_id}/application/{application_id}/analytics/today/" do + calls = stub_api(status: 200, body: <<~'JSON') + { + "time_zone": "Europe/Madrid", + "date": "2026-10-30", + "current_hour": 14, + "previous_date": "2026-10-23", + "hours": [ + 3, + 1, + 0, + 0, + 1, + 2, + 4, + 9, + 14, + 18, + 21, + 19, + 22, + 24, + 27, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "previous_hours": [ + 2, + 1, + 1, + 0, + 1, + 3, + 5, + 8, + 12, + 16, + 19, + 18, + 20, + 22, + 24, + 26, + 23, + 19, + 15, + 12, + 9, + 7, + 5, + 3 + ], + "total": 165, + "previous_total_so_far": 151, + "outcomes": { + "approved": 139, + "in_review": 6, + "declined": 18 + } + } + JSON + result = client.analytics.retrieve_today( + tz: "Europe/Madrid" + ) + request = expect_api_request( + calls, + method: :get, + url: "https://verification.didit.me/v3/organization/org-7f3a/application/app-91c2/analytics/today/", + query: [ + [ + "tz", + "Europe/Madrid" + ] + ], + auth: :api_key, + accept: "application/json" + ) + expect_no_body(request) + expect(result).to be_a(Didit::Types::ApplicationAnalyticsToday) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end end diff --git a/spec/generated/businesses_spec.rb b/spec/generated/businesses_spec.rb index 3cefca7..4bbd103 100644 --- a/spec/generated/businesses_spec.rb +++ b/spec/generated/businesses_spec.rb @@ -437,7 +437,10 @@ } JSON result = client.businesses.set_ongoing_monitoring( - is_enabled: true + is_enabled: true, + didit_internal_id_list: [ + "b0000000-0000-4000-8000-0000000000b1" + ] ) request = expect_api_request( calls, @@ -448,7 +451,10 @@ accept: "application/json" ) expect_json_body(request, { - "is_enabled" => true + "is_enabled" => true, + "didit_internal_id_list" => [ + "b0000000-0000-4000-8000-0000000000b1" + ] }) expect(result).to be_a(Didit::Types::OngoingMonitoringToggleResult) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -470,7 +476,11 @@ } JSON result = client.businesses.set_session_ongoing_monitoring( - is_enabled: true + is_enabled: true, + session_numbers: [ + "1001", + "1002" + ] ) request = expect_api_request( calls, @@ -481,7 +491,11 @@ accept: "application/json" ) expect_json_body(request, { - "is_enabled" => true + "is_enabled" => true, + "session_numbers" => [ + "1001", + "1002" + ] }) expect(result).to be_a(Didit::Types::OngoingMonitoringToggleResult) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) diff --git a/spec/generated/cases_spec.rb b/spec/generated/cases_spec.rb index 31ac6ff..c2af45b 100644 --- a/spec/generated/cases_spec.rb +++ b/spec/generated/cases_spec.rb @@ -37,7 +37,11 @@ JSON result = client.cases.apply_entity_action( "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - action: "set_status" + client_reference: "e1a00000-0000-4000-8000-000000000001", + action: "add_tags", + tags: [ + "source-of-funds-reviewed" + ] ) request = expect_api_request( calls, @@ -48,7 +52,11 @@ accept: "application/json" ) expect_json_body(request, { - "action" => "set_status" + "client_reference" => "e1a00000-0000-4000-8000-000000000001", + "action" => "add_tags", + "tags" => [ + "source-of-funds-reviewed" + ] }) expect(result).to be_a(Didit::Types::CaseActionCaseEntityActionResult) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -440,7 +448,7 @@ JSON result = client.cases.assign( "c1a5e000-0000-4000-8000-000000000001", - assignee_user_id: "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + assignee_user_id: "9a000000-0000-4000-8000-0000000000aa" ) request = expect_api_request( calls, @@ -451,7 +459,7 @@ accept: "application/json" ) expect_json_body(request, { - "assignee_user_id" => "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "assignee_user_id" => "9a000000-0000-4000-8000-0000000000aa" }) expect(result).to be_a(Didit::Types::CaseDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -472,9 +480,9 @@ JSON result = client.cases.bulk_assign( case_uuids: [ - "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "c1a5e000-0000-4000-8000-000000000001" ], - assignee_user_id: "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + assignee_user_id: "9a000000-0000-4000-8000-0000000000aa" ) request = expect_api_request( calls, @@ -486,9 +494,9 @@ ) expect_json_body(request, { "case_uuids" => [ - "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "c1a5e000-0000-4000-8000-000000000001" ], - "assignee_user_id" => "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "assignee_user_id" => "9a000000-0000-4000-8000-0000000000aa" }) expect(result).to be_a(Didit::Types::CaseBulkUpdateResult) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -509,9 +517,10 @@ JSON result = client.cases.bulk_update_status( case_uuids: [ - "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "c1a5e000-0000-4000-8000-000000000001" ], - status: "OPEN" + status: "RESOLVED", + resolution: "FALSE_POSITIVE" ) request = expect_api_request( calls, @@ -523,9 +532,10 @@ ) expect_json_body(request, { "case_uuids" => [ - "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "c1a5e000-0000-4000-8000-000000000001" ], - "status" => "OPEN" + "status" => "RESOLVED", + "resolution" => "FALSE_POSITIVE" }) expect(result).to be_a(Didit::Types::CaseBulkUpdateResult) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -716,7 +726,16 @@ } JSON result = client.cases.create( - title: "title-value" + title: "Manual - Jane Doe", + blueprint: "b1de0000-0000-4000-8000-000000000002", + priority: "HIGH", + subject: { + type: "user", + uuid: "5b9a0000-0000-4000-8000-00000000f00d" + }, + tags: [ + "review" + ] ) request = expect_api_request( calls, @@ -727,7 +746,16 @@ accept: "application/json" ) expect_json_body(request, { - "title" => "title-value" + "title" => "Manual - Jane Doe", + "blueprint" => "b1de0000-0000-4000-8000-000000000002", + "priority" => "HIGH", + "subject" => { + "type" => "user", + "uuid" => "5b9a0000-0000-4000-8000-00000000f00d" + }, + "tags" => [ + "review" + ] }) expect(result).to be_a(Didit::Types::CaseDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -968,7 +996,12 @@ ] } JSON - result = client.cases.find_duplicates + result = client.cases.find_duplicates( + subject: { + type: "user", + uuid: "5b9a0000-0000-4000-8000-00000000f00d" + } + ) request = expect_api_request( calls, method: :post, @@ -977,7 +1010,12 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "subject" => { + "type" => "user", + "uuid" => "5b9a0000-0000-4000-8000-00000000f00d" + } + }) expect(result).to be_a(Didit::Types::CaseDuplicateCaseDuplicatePage) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) @@ -1523,7 +1561,8 @@ } JSON result = client.cases.reject_resolution( - "c1a5e000-0000-4000-8000-000000000001" + "c1a5e000-0000-4000-8000-000000000001", + notes: "Needs a clearer rationale before this can be approved." ) request = expect_api_request( calls, @@ -1533,7 +1572,9 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "notes" => "Needs a clearer rationale before this can be approved." + }) expect(result).to be_a(Didit::Types::CaseDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) @@ -2672,7 +2713,7 @@ JSON result = client.cases.transfer( "c1a5e000-0000-4000-8000-000000000001", - target_blueprint: "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + target_blueprint: "b1de0000-0000-4000-8000-000000000002" ) request = expect_api_request( calls, @@ -2683,7 +2724,7 @@ accept: "application/json" ) expect_json_body(request, { - "target_blueprint" => "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "target_blueprint" => "b1de0000-0000-4000-8000-000000000002" }) expect(result).to be_a(Didit::Types::CaseDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -2974,10 +3015,20 @@ } JSON result = client.cases.blueprints.create( - name: "name-value", + name: "AML investigation", assignee_pool: [ - "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" - ] + "9a000000-0000-4000-8000-0000000000aa" + ], + assignment_method: "AUTOMATIC", + max_active_cases: 15, + require_resolution_note: true, + content_config: { + aml_control: { + enabled: true, + financial: true, + identity: false + } + } ) request = expect_api_request( calls, @@ -2988,10 +3039,20 @@ accept: "application/json" ) expect_json_body(request, { - "name" => "name-value", + "name" => "AML investigation", "assignee_pool" => [ - "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" - ] + "9a000000-0000-4000-8000-0000000000aa" + ], + "assignment_method" => "AUTOMATIC", + "max_active_cases" => 15, + "require_resolution_note" => true, + "content_config" => { + "aml_control" => { + "enabled" => true, + "financial" => true, + "identity" => false + } + } }) expect(result).to be_a(Didit::Types::CaseBlueprintDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -3045,7 +3106,12 @@ ] } JSON - result = client.cases.blueprints.install_presets + result = client.cases.blueprints.install_presets( + preset_keys: [ + "aml_investigation", + "kyc" + ] + ) request = expect_api_request( calls, method: :post, @@ -3054,7 +3120,12 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "preset_keys" => [ + "aml_investigation", + "kyc" + ] + }) expect(result).to be_a(Didit::Types::CaseBlueprintPresetInstallResult) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) @@ -3390,8 +3461,10 @@ result = client.cases.blueprints.save_draft( "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", expected_version: 1, - expected_revision: "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - changes: {} + expected_revision: "4e5f0000-0000-4000-8000-000000000003", + changes: { + max_active_cases: 20 + } ) request = expect_api_request( calls, @@ -3403,8 +3476,10 @@ ) expect_json_body(request, { "expected_version" => 1, - "expected_revision" => "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - "changes" => {} + "expected_revision" => "4e5f0000-0000-4000-8000-000000000003", + "changes" => { + "max_active_cases" => 20 + } }) expect(result).to be_a(Didit::Types::CasePublicationPolicyDraft) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -3490,7 +3565,8 @@ } JSON result = client.cases.blueprints.update( - "b1de0000-0000-4000-8000-000000000002" + "b1de0000-0000-4000-8000-000000000002", + transfer_enabled: true ) request = expect_api_request( calls, @@ -3500,7 +3576,9 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "transfer_enabled" => true + }) expect(result).to be_a(Didit::Types::CaseBlueprintDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) @@ -3580,8 +3658,8 @@ JSON result = client.cases.links.create( "c1a5e000-0000-4000-8000-000000000001", - entity_type: "session", - entity_uuid: "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + entity_type: "transaction", + entity_uuid: "77000000-0000-4000-8000-000000000077" ) request = expect_api_request( calls, @@ -3592,8 +3670,8 @@ accept: "application/json" ) expect_json_body(request, { - "entity_type" => "session", - "entity_uuid" => "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "entity_type" => "transaction", + "entity_uuid" => "77000000-0000-4000-8000-000000000077" }) expect(result).to be_a(Didit::Types::CaseLink) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -3671,7 +3749,7 @@ JSON result = client.cases.notes.create( "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - comment: "comment-value" + comment: "Proof of address matches the ID document." ) request = expect_api_request( calls, @@ -3682,7 +3760,7 @@ accept: "application/json" ) expect_json_body(request, { - "comment" => "comment-value" + "comment" => "Proof of address matches the ID document." }) expect(result).to be_a(Didit::Types::CaseCollaborationCaseNote) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -3846,7 +3924,8 @@ JSON result = client.cases.notes.update( "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", + is_pinned: true ) request = expect_api_request( calls, @@ -3856,7 +3935,9 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "is_pinned" => true + }) expect(result).to be_a(Didit::Types::CaseCollaborationCaseNote) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) @@ -3919,7 +4000,8 @@ } JSON result = client.cases.regulatory_reports.create( - "c1a5e000-0000-4000-8000-000000000001" + "c1a5e000-0000-4000-8000-000000000001", + template: "7ec00000-0000-4000-8000-000000000006" ) request = expect_api_request( calls, @@ -3929,7 +4011,9 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "template" => "7ec00000-0000-4000-8000-000000000006" + }) expect(result).to be_a(Didit::Types::RegulatoryReportDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) @@ -4298,15 +4382,15 @@ } JSON result = client.cases.routing_rules.create( - name: "name-value", + name: "AML screening alerts", conditions: [ { field: "source", operator: "equals", - value: "value-value" + value: "AML_SCREENING" } ], - blueprint: "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + blueprint: "b1de0000-0000-4000-8000-000000000002" ) request = expect_api_request( calls, @@ -4317,15 +4401,15 @@ accept: "application/json" ) expect_json_body(request, { - "name" => "name-value", + "name" => "AML screening alerts", "conditions" => [ { "field" => "source", "operator" => "equals", - "value" => "value-value" + "value" => "AML_SCREENING" } ], - "blueprint" => "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "blueprint" => "b1de0000-0000-4000-8000-000000000002" }) expect(result).to be_a(Didit::Types::CaseRoutingRule) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -4619,8 +4703,10 @@ result = client.cases.routing_rules.save_draft( "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", expected_version: 1, - expected_revision: "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - changes: {} + expected_revision: "4e5f0000-0000-4000-8000-000000000003", + changes: { + priority: 10 + } ) request = expect_api_request( calls, @@ -4632,8 +4718,10 @@ ) expect_json_body(request, { "expected_version" => 1, - "expected_revision" => "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - "changes" => {} + "expected_revision" => "4e5f0000-0000-4000-8000-000000000003", + "changes" => { + "priority" => 10 + } }) expect(result).to be_a(Didit::Types::RoutingPublicationPolicyDraft) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -4708,10 +4796,11 @@ } JSON result = client.cases.teams.create( - name: "name-value", + name: "AML analysts", members: [ { - user_id: "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + user_id: "9a000000-0000-4000-8000-0000000000aa", + capacity: 10 } ] ) @@ -4724,10 +4813,11 @@ accept: "application/json" ) expect_json_body(request, { - "name" => "name-value", + "name" => "AML analysts", "members" => [ { - "user_id" => "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "user_id" => "9a000000-0000-4000-8000-0000000000aa", + "capacity" => 10 } ] }) diff --git a/spec/generated/database_validation_spec.rb b/spec/generated/database_validation_spec.rb index 8d3b380..e8b1e7f 100644 --- a/spec/generated/database_validation_spec.rb +++ b/spec/generated/database_validation_spec.rb @@ -52,6 +52,14 @@ JSON result = client.database_validation.validate( issuing_state: "BRA", + services: [ + "bra_cpf" + ], + identification_number: "12345678900", + first_name: "John", + last_name: "Doe", + date_of_birth: "1980-01-01", + vendor_data: "user-1234", selfie: Didit::FilePart.new("fake-selfie-bytes", filename: "selfie.jpg", content_type: "image/jpeg") ) request = expect_api_request( @@ -65,7 +73,13 @@ expect_multipart_body( request, fields: { - "issuing_state" => "BRA" + "issuing_state" => "BRA", + "services" => "[\"bra_cpf\"]", + "identification_number" => "12345678900", + "first_name" => "John", + "last_name" => "Doe", + "date_of_birth" => "1980-01-01", + "vendor_data" => "user-1234" }, files: { "selfie" => [ diff --git a/spec/generated/fraud_checks_spec.rb b/spec/generated/fraud_checks_spec.rb index 830fee6..84ee956 100644 --- a/spec/generated/fraud_checks_spec.rb +++ b/spec/generated/fraud_checks_spec.rb @@ -83,12 +83,24 @@ } JSON result = client.fraud_checks.create( + client_reference: "review-attempt-001", subject: { identifiers: [ { - type: {}, - value: "value-value" + type: "email", + value: "applicant@example.com" } + ], + attributes: { + first_name: "Alex", + last_name: "Example" + } + }, + checks: { + include: [ + "networks_same_org", + "networks_cross_org", + "email_risk" ] } ) @@ -101,12 +113,24 @@ accept: "application/json" ) expect_json_body(request, { + "client_reference" => "review-attempt-001", "subject" => { "identifiers" => [ { - "type" => {}, - "value" => "value-value" + "type" => "email", + "value" => "applicant@example.com" } + ], + "attributes" => { + "first_name" => "Alex", + "last_name" => "Example" + } + }, + "checks" => { + "include" => [ + "networks_same_org", + "networks_cross_org", + "email_risk" ] } }) @@ -137,12 +161,24 @@ } JSON result = client.fraud_checks.plan( + client_reference: "review-attempt-001", subject: { identifiers: [ { - type: {}, - value: "value-value" + type: "email", + value: "applicant@example.com" } + ], + attributes: { + first_name: "Alex", + last_name: "Example" + } + }, + checks: { + include: [ + "networks_same_org", + "networks_cross_org", + "email_risk" ] } ) @@ -155,12 +191,24 @@ accept: "application/json" ) expect_json_body(request, { + "client_reference" => "review-attempt-001", "subject" => { "identifiers" => [ { - "type" => {}, - "value" => "value-value" + "type" => "email", + "value" => "applicant@example.com" } + ], + "attributes" => { + "first_name" => "Alex", + "last_name" => "Example" + } + }, + "checks" => { + "include" => [ + "networks_same_org", + "networks_cross_org", + "email_risk" ] } }) diff --git a/spec/generated/id_wallets_spec.rb b/spec/generated/id_wallets_spec.rb index a40ddd4..0a59bf2 100644 --- a/spec/generated/id_wallets_spec.rb +++ b/spec/generated/id_wallets_spec.rb @@ -989,6 +989,84 @@ exercise_readers(result) end + it "id_wallets.start_google_wallet sends POST /v3/id-verification/wallets/google-wallet/" do + calls = stub_api(status: 201, body: <<~'JSON') + { + "request_id": "00000000-0000-4000-8000-000000000001", + "wallet_verification": { + "wallet": { + "id": "google_wallet", + "name": "Google Wallet", + "issuing_authority": "Google Wallet (ID pass) and US state issuers (mobile driving licence)" + }, + "country": "USA", + "status": "Not Finished", + "outcome": "pending", + "error": null, + "interaction": "digital_credentials", + "simulated": false, + "expires_at": "2026-01-01T10:10:00Z", + "next_action": { + "type": "request_digital_credential", + "digital_credentials": { + "protocol": "openid4vp-v1-signed", + "request": { + "requests": [ + { + "protocol": "openid4vp-v1-signed", + "data": { + "request": "" + } + } + ] + } + } + }, + "identity": null, + "attributes": null, + "level_of_assurance": null, + "verified_at": null, + "signature_valid": null, + "credential_type": "redacted-credential_type" + }, + "vendor_data": "your-customer-reference", + "metadata": { + "reference": "example" + }, + "created_at": "2026-01-01T10:00:00Z" + } + JSON + result = client.id_wallets.start_google_wallet( + country: "USA", + vendor_data: "your-customer-reference", + metadata: { + reference: "example" + }, + origin: "https://app.example.com", + idempotency_key: "idem-key-1" + ) + request = expect_api_request( + calls, + method: :post, + url: "https://verification.didit.me/v3/id-verification/wallets/google-wallet/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_json_body(request, { + "country" => "USA", + "vendor_data" => "your-customer-reference", + "metadata" => { + "reference" => "example" + }, + "origin" => "https://app.example.com" + }) + expect(request.headers["Idempotency-Key"]).to eq("idem-key-1") + expect(result).to be_a(Didit::Types::DigitalIdWalletApiWalletVerificationResponse) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end + it "id_wallets.start_govbr sends POST /v3/id-verification/wallets/govbr/" do calls = stub_api(status: 201, body: <<~'JSON') { @@ -1850,4 +1928,76 @@ expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) end + + it "id_wallets.submit_verification_response sends POST /v3/id-verification/wallets/verifications/{request_id}/response/" do + calls = stub_api(status: 200, body: <<~'JSON') + { + "request_id": "00000000-0000-4000-8000-000000000001", + "wallet_verification": { + "wallet": { + "id": "google_wallet", + "name": "Google Wallet", + "issuing_authority": "Google Wallet (ID pass) and US state issuers (mobile driving licence)" + }, + "country": "USA", + "status": "Approved", + "outcome": "verified", + "error": null, + "interaction": "digital_credentials", + "simulated": false, + "expires_at": "2026-01-01T10:10:00Z", + "next_action": null, + "identity": { + "full_name": "Alex Example", + "first_name": "Alex", + "last_name": "Example", + "date_of_birth": "1990-01-31", + "nationality": "USA", + "issuing_state": "USA" + }, + "attributes": { + "document_number": "X0000000", + "document_expiry_date": "2030-01-31" + }, + "level_of_assurance": "substantial", + "verified_at": "2026-01-01T10:01:00Z", + "signature_valid": true, + "credential_type": "redacted-credential_type" + }, + "vendor_data": "your-customer-reference", + "metadata": { + "reference": "example" + }, + "created_at": "2026-01-01T10:00:00Z" + } + JSON + result = client.id_wallets.submit_verification_response( + "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", + response: { + protocol: "openid4vp-v1-signed", + data: { + response: "" + } + } + ) + request = expect_api_request( + calls, + method: :post, + url: "https://verification.didit.me/v3/id-verification/wallets/verifications/3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b/response/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_json_body(request, { + "response" => { + "protocol" => "openid4vp-v1-signed", + "data" => { + "response" => "" + } + } + }) + expect(result).to be_a(Didit::Types::DigitalIdWalletApiWalletVerificationResponse) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end end diff --git a/spec/generated/investigator_spec.rb b/spec/generated/investigator_spec.rb index 19347dd..12eaa7e 100644 --- a/spec/generated/investigator_spec.rb +++ b/spec/generated/investigator_spec.rb @@ -41,7 +41,8 @@ } JSON result = client.investigator.accept_run( - "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", + send_email: false ) request = expect_api_request( calls, @@ -51,7 +52,9 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "send_email" => false + }) expect(result).to be_a(Didit::Types::InvestigatorDecision) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) @@ -250,9 +253,9 @@ JSON result = client.investigator.override_run( "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - action: "approve", - category: "missing_context", - reason: "reason-value" + action: "decline", + category: "evidence_misread", + reason: "The proof of address is older than three months." ) request = expect_api_request( calls, @@ -263,9 +266,9 @@ accept: "application/json" ) expect_json_body(request, { - "action" => "approve", - "category" => "missing_context", - "reason" => "reason-value" + "action" => "decline", + "category" => "evidence_misread", + "reason" => "The proof of address is older than three months." }) expect(result).to be_a(Didit::Types::InvestigatorDecision) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -548,7 +551,10 @@ } } JSON - result = client.investigator.update_settings + result = client.investigator.update_settings( + stage: "shadow", + monthly_spend_limit: "500.00" + ) request = expect_api_request( calls, method: :patch, @@ -557,7 +563,10 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "stage" => "shadow", + "monthly_spend_limit" => "500.00" + }) expect(result).to be_a(Didit::Types::InvestigatorSettings) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) diff --git a/spec/generated/kyb_spec.rb b/spec/generated/kyb_spec.rb index 795d99b..f55e82b 100644 --- a/spec/generated/kyb_spec.rb +++ b/spec/generated/kyb_spec.rb @@ -81,24 +81,7 @@ "next_account": "26 February 2026", "due_by_date": "26 August 2026" }, - "registry_data": { - "name": "Tesco PLC", - "registration_number": "00445790", - "status": "active", - "type": "Public Limited Company", - "incorporation_date": "1947-11-27", - "tax_number": "GB412 8925 93", - "country_code": "GB", - "fetch_status": "resolved", - "industries_detail": [ - { - "code": "47110", - "name": "Retail Sale In Non-specialised Stores With Food, Beverages Or Tobacco Predominating", - "description": null, - "meta_detail": [] - } - ] - }, + "registry_data": {}, "user_provided_data": null, "confirmed_by_user_at": null, "last_console_edit_at": null, @@ -110,7 +93,8 @@ } JSON result = client.kyb.list_shareholders( - kyb_response_id: "69aeeb95febb0f1704042259" + kyb_response_id: "69aeeb95febb0f1704042259", + vendor_data: "company-1234" ) request = expect_api_request( calls, @@ -121,7 +105,8 @@ accept: "application/json" ) expect_json_body(request, { - "kyb_response_id" => "69aeeb95febb0f1704042259" + "kyb_response_id" => "69aeeb95febb0f1704042259", + "vendor_data" => "company-1234" }) expect(result).to be_a(Didit::Types::KybListShareholdersResponse) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -204,22 +189,11 @@ "due_by_date": "26 August 2026" }, "registry_data": { - "name": "Tesco PLC", - "registration_number": "00445790", - "status": "active", - "type": "Public Limited Company", - "incorporation_date": "1947-11-27", - "tax_number": "GB412 8925 93", - "country_code": "GB", - "fetch_status": "resolved", - "industries_detail": [ - { - "code": "47110", - "name": "Retail Sale In Non-specialised Stores With Food, Beverages Or Tobacco Predominating", - "description": null, - "meta_detail": [] - } - ] + "ubo_resolution": { + "parent_chain": [], + "subsidiaries": [], + "unresolved": [] + } }, "user_provided_data": null, "confirmed_by_user_at": null, @@ -232,7 +206,8 @@ } JSON result = client.kyb.list_ubos( - kyb_response_id: "69aeeb95febb0f1704042259" + kyb_response_id: "69aeeb95febb0f1704042259", + vendor_data: "company-1234" ) request = expect_api_request( calls, @@ -243,7 +218,8 @@ accept: "application/json" ) expect_json_body(request, { - "kyb_response_id" => "69aeeb95febb0f1704042259" + "kyb_response_id" => "69aeeb95febb0f1704042259", + "vendor_data" => "company-1234" }) expect(result).to be_a(Didit::Types::KybListUbosResponse) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -289,7 +265,10 @@ } JSON result = client.kyb.search( - country_code: "GB" + country_code: "GB", + name: "Tesco", + search_type: "contains", + vendor_data: "company-1234" ) request = expect_api_request( calls, @@ -300,7 +279,10 @@ accept: "application/json" ) expect_json_body(request, { - "country_code" => "GB" + "country_code" => "GB", + "name" => "Tesco", + "search_type" => "contains", + "vendor_data" => "company-1234" }) expect(result).to be_a(Didit::Types::KybSearchResponse) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -382,24 +364,7 @@ "next_account": "26 February 2026", "due_by_date": "26 August 2026" }, - "registry_data": { - "name": "Tesco PLC", - "registration_number": "00445790", - "status": "active", - "type": "Public Limited Company", - "incorporation_date": "1947-11-27", - "tax_number": "GB412 8925 93", - "country_code": "GB", - "fetch_status": "resolved", - "industries_detail": [ - { - "code": "47110", - "name": "Retail Sale In Non-specialised Stores With Food, Beverages Or Tobacco Predominating", - "description": null, - "meta_detail": [] - } - ] - }, + "registry_data": {}, "user_provided_data": null, "confirmed_by_user_at": null, "last_console_edit_at": null, @@ -411,7 +376,8 @@ } JSON result = client.kyb.select( - kyb_response_id: "69aeeb95febb0f1704042259" + kyb_response_id: "69aeeb95febb0f1704042259", + vendor_data: "company-1234" ) request = expect_api_request( calls, @@ -422,7 +388,8 @@ accept: "application/json" ) expect_json_body(request, { - "kyb_response_id" => "69aeeb95febb0f1704042259" + "kyb_response_id" => "69aeeb95febb0f1704042259", + "vendor_data" => "company-1234" }) expect(result).to be_a(Didit::Types::KybSelectResponse) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) diff --git a/spec/generated/regulatory_reports_spec.rb b/spec/generated/regulatory_reports_spec.rb index 81e4b77..59239af 100644 --- a/spec/generated/regulatory_reports_spec.rb +++ b/spec/generated/regulatory_reports_spec.rb @@ -63,8 +63,8 @@ } JSON result = client.regulatory_reports.create( - case: "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - template: "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + case: "c1a5e000-0000-4000-8000-000000000001", + template: "7ec00000-0000-4000-8000-000000000006" ) request = expect_api_request( calls, @@ -75,8 +75,8 @@ accept: "application/json" ) expect_json_body(request, { - "case" => "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - "template" => "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b" + "case" => "c1a5e000-0000-4000-8000-000000000001", + "template" => "7ec00000-0000-4000-8000-000000000006" }) expect(result).to be_a(Didit::Types::RegulatoryReportDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -409,7 +409,9 @@ } JSON result = client.regulatory_reports.update( - "5ec00000-0000-4000-8000-000000000007" + "5ec00000-0000-4000-8000-000000000007", + rentity_id: "FIU-US-00123", + currency_code_local: "USD" ) request = expect_api_request( calls, @@ -419,7 +421,10 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "rentity_id" => "FIU-US-00123", + "currency_code_local" => "USD" + }) expect(result).to be_a(Didit::Types::RegulatoryReportDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) diff --git a/spec/generated/report_templates_spec.rb b/spec/generated/report_templates_spec.rb index 9b7140f..93b1034 100644 --- a/spec/generated/report_templates_spec.rb +++ b/spec/generated/report_templates_spec.rb @@ -20,9 +20,14 @@ } JSON result = client.report_templates.create( - name: "name-value", - jurisdiction: "jurisdiction-value", - report_type: "SAR" + name: "US SAR default", + jurisdiction: "US", + report_type: "SAR", + field_config: { + rentity_id: "FIU-US-00123", + submission_code: "E", + currency_code_local: "USD" + } ) request = expect_api_request( calls, @@ -33,9 +38,14 @@ accept: "application/json" ) expect_json_body(request, { - "name" => "name-value", - "jurisdiction" => "jurisdiction-value", - "report_type" => "SAR" + "name" => "US SAR default", + "jurisdiction" => "US", + "report_type" => "SAR", + "field_config" => { + "rentity_id" => "FIU-US-00123", + "submission_code" => "E", + "currency_code_local" => "USD" + } }) expect(result).to be_a(Didit::Types::ReportTemplateDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -139,7 +149,10 @@ } JSON result = client.report_templates.update( - "7ec00000-0000-4000-8000-000000000006" + "7ec00000-0000-4000-8000-000000000006", + field_config: { + rentity_id: "FIU-US-00124" + } ) request = expect_api_request( calls, @@ -149,7 +162,11 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "field_config" => { + "rentity_id" => "FIU-US-00124" + } + }) expect(result).to be_a(Didit::Types::ReportTemplateDetail) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) diff --git a/spec/generated/sessions_spec.rb b/spec/generated/sessions_spec.rb index 6842de0..8073a9c 100644 --- a/spec/generated/sessions_spec.rb +++ b/spec/generated/sessions_spec.rb @@ -116,8 +116,8 @@ { "message": "Updated 2 hit(s) successfully", "updated_hits": [ - "abc123", - "def456" + "hit_7c1e9a40b2d35f86e0a4c912", + "hit_3b8f20d6a91c4e75f0b2d6a8" ] } JSON @@ -125,8 +125,12 @@ "11111111-2222-3333-4444-555555555555", hit_updates: [ { - hit_id: "abc123", - review_status: "Unreviewed" + hit_id: "hit_7c1e9a40b2d35f86e0a4c912", + review_status: "Confirmed Match" + }, + { + hit_id: "hit_3b8f20d6a91c4e75f0b2d6a8", + review_status: "False Positive" } ], node_id_query: "feature_aml_1" @@ -147,8 +151,12 @@ expect_json_body(request, { "hit_updates" => [ { - "hit_id" => "abc123", - "review_status" => "Unreviewed" + "hit_id" => "hit_7c1e9a40b2d35f86e0a4c912", + "review_status" => "Confirmed Match" + }, + { + "hit_id" => "hit_3b8f20d6a91c4e75f0b2d6a8", + "review_status" => "False Positive" } ] }) @@ -285,6 +293,67 @@ exercise_readers(result) end + it "sessions.create_kyb_party_draft sends POST /v3/session/{sessionId}/kyb/parties/drafts/" do + calls = stub_api(status: 201, body: <<~'JSON') + { + "draft_id": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d", + "created_at": "2026-10-31T10:00:00Z", + "updated_at": "2026-10-31T10:00:00Z", + "party": { + "entity_type": "person", + "first_name": "Ana", + "last_name": "Lopez", + "roles": [ + "ubo", + "director" + ], + "ownership_percent": 60, + "nationality": "MEX", + "email": "ana.lopez@example.com", + "date_of_birth": "1984-06-12" + } + } + JSON + result = client.sessions.create_kyb_party_draft( + "33333333-4444-5555-6666-777777777777", + entity_type: "person", + first_name: "Ana", + last_name: "Lopez", + roles: [ + "ubo", + "director" + ], + ownership_percent: 60, + nationality: "MEX", + email: "ana.lopez@example.com", + date_of_birth: "1984-06-12" + ) + request = expect_api_request( + calls, + method: :post, + url: "https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/parties/drafts/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_json_body(request, { + "entity_type" => "person", + "first_name" => "Ana", + "last_name" => "Lopez", + "roles" => [ + "ubo", + "director" + ], + "ownership_percent" => 60, + "nationality" => "MEX", + "email" => "ana.lopez@example.com", + "date_of_birth" => "1984-06-12" + }) + expect(result).to be_a(Didit::Types::SessionsCreateKybPartyDraftResponse) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end + it "sessions.delete sends DELETE /v3/session/{sessionId}/delete/" do calls = stub_api(status: 200, body: <<~'JSON') { @@ -320,11 +389,30 @@ exercise_readers(result) end + it "sessions.delete_kyb_party_draft sends DELETE /v3/session/{sessionId}/kyb/parties/drafts/{draftId}/" do + calls = stub_api(status: 204, body: nil, content_type: nil) + result = client.sessions.delete_kyb_party_draft( + "33333333-4444-5555-6666-777777777777", + "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d" + ) + request = expect_api_request( + calls, + method: :delete, + url: "https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/parties/drafts/5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_no_body(request) + expect(result).to be_nil + end + it "sessions.export_aml_screening_history sends GET /v3/session/{sessionId}/aml-screening-history/export/" do calls = stub_api(status: 200, body: "fake-binary-body", content_type: "text/csv") result = client.sessions.export_aml_screening_history( "11111111-2222-3333-4444-555555555555", - node_id: "feature_aml_1" + node_id: "feature_aml_1", + month: "2026-09" ) request = expect_api_request( calls, @@ -334,6 +422,10 @@ [ "node_id", "feature_aml_1" + ], + [ + "month", + "2026-09" ] ], auth: :api_key, @@ -343,6 +435,38 @@ expect(result).to eq("fake-binary-body") end + it "sessions.export_files sends POST /v3/session/{sessionId}/files-export/" do + calls = stub_api(status: 202, body: <<~'JSON') + { + "export_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "session_id": "11111111-2222-3333-4444-555555555555", + "status": "PENDING", + "file_count": null, + "size_bytes": null, + "download_url": null, + "expires_at": null, + "error": null, + "created_at": "2026-10-29T12:00:03Z", + "completed_at": null + } + JSON + result = client.sessions.export_files( + "11111111-2222-3333-4444-555555555555" + ) + request = expect_api_request( + calls, + method: :post, + url: "https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/files-export/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_no_body(request) + expect(result).to be_a(Didit::Types::SessionFilesExport) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end + it "sessions.generate_pdf sends GET /v3/session/{sessionId}/generate-pdf/" do calls = stub_api(status: 200, body: "fake-binary-body", content_type: "application/pdf") result = client.sessions.generate_pdf( @@ -360,6 +484,39 @@ expect(result).to eq("fake-binary-body") end + it "sessions.get_files_export sends GET /v3/session/{sessionId}/files-export/{exportId}/" do + calls = stub_api(status: 200, body: <<~'JSON') + { + "export_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "session_id": "11111111-2222-3333-4444-555555555555", + "status": "READY", + "file_count": 9, + "size_bytes": 18734120, + "download_url": "https://storage.example.com/session/11111111-2222-3333-4444-555555555555/files-export/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/session-42-files.zip?X-Amz-Signature=...", + "expires_at": "2026-10-30T12:00:41Z", + "error": null, + "created_at": "2026-10-29T12:00:03Z", + "completed_at": "2026-10-29T12:00:41Z" + } + JSON + result = client.sessions.get_files_export( + "11111111-2222-3333-4444-555555555555", + "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" + ) + request = expect_api_request( + calls, + method: :get, + url: "https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/files-export/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_no_body(request) + expect(result).to be_a(Didit::Types::SessionFilesExport) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end + it "sessions.import_shared sends POST /v3/session/import-shared/" do calls = stub_api(status: 201, body: <<~'JSON') { @@ -644,6 +801,7 @@ "results": [ { "uuid": "dddddddd-1111-2222-3333-444444444444", + "run_id": "aaaaaaaa-1111-2222-3333-444444444444", "completed_at": "2026-09-14T04:12:33.481207Z", "started_at": "2026-09-14T04:00:01.002311Z", "outcome": "NO_CHANGE", @@ -652,6 +810,8 @@ "status": "Approved", "score": 0.0, "total_hits": 0, + "new_hits": 0, + "entities_screened": 1, "dataset_freshness": { "captured_at": "2026-09-14T03:58:02.114820+00:00", "provider": "aml_data_source", @@ -680,6 +840,7 @@ }, { "uuid": "eeeeeeee-1111-2222-3333-444444444444", + "run_id": "bbbbbbbb-1111-2222-3333-444444444444", "completed_at": "2026-09-13T04:11:58.020914Z", "started_at": "2026-09-13T04:00:00.871022Z", "outcome": "FAILED", @@ -688,6 +849,8 @@ "status": "Approved", "score": 0.0, "total_hits": 0, + "new_hits": null, + "entities_screened": 0, "dataset_freshness": null } ] @@ -696,6 +859,7 @@ result = client.sessions.list_aml_screening_history( "11111111-2222-3333-4444-555555555555", node_id: "feature_aml_1", + month: "2026-09", limit: 50, offset: 0, ordering: "completed_at" @@ -709,6 +873,10 @@ "node_id", "feature_aml_1" ], + [ + "month", + "2026-09" + ], [ "limit", "50" @@ -893,6 +1061,102 @@ exercise_readers(result) end + it "sessions.list_kyb_extracted_parties sends GET /v3/session/{sessionId}/kyb/extracted-parties/" do + calls = stub_api(status: 200, body: <<~'JSON') + { + "parties": [ + { + "name": "Ana Lopez", + "entity_type": "person", + "first_name": "Ana", + "last_name": "Lopez", + "appointment_date": null, + "designation": "Administrador unico", + "roles": [ + { + "role": "shareholder", + "ownership_percent": { + "text": "60%", + "min": 60, + "max": 60 + } + } + ], + "documents": [ + { + "document_uuid": "0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41", + "document_type": "OWNERSHIP_STRUCTURE", + "document_subtype": "ARTICLES_OF_INCORPORATION", + "original_filename": "acta_constitutiva.pdf", + "status": "Approved" + } + ] + } + ], + "document_count": 1, + "node_id": "node_kyb_documents" + } + JSON + result = client.sessions.list_kyb_extracted_parties( + "33333333-4444-5555-6666-777777777777" + ) + request = expect_api_request( + calls, + method: :get, + url: "https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/extracted-parties/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_no_body(request) + expect(result).to be_a(Didit::Types::SessionsListKybExtractedPartiesResponse) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end + + it "sessions.list_kyb_party_drafts sends GET /v3/session/{sessionId}/kyb/parties/drafts/" do + calls = stub_api(status: 200, body: <<~'JSON') + { + "parties": [ + { + "draft_id": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d", + "created_at": "2026-10-31T10:00:00Z", + "updated_at": "2026-10-31T10:00:00Z", + "party": { + "entity_type": "person", + "first_name": "Ana", + "last_name": "Lopez", + "roles": [ + "ubo", + "director" + ], + "ownership_percent": 60, + "nationality": "MEX", + "email": "ana.lopez@example.com", + "date_of_birth": "1984-06-12" + } + } + ], + "node_id": "node_kyb_key_people" + } + JSON + result = client.sessions.list_kyb_party_drafts( + "33333333-4444-5555-6666-777777777777" + ) + request = expect_api_request( + calls, + method: :get, + url: "https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/parties/drafts/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_no_body(request) + expect(result).to be_a(Didit::Types::SessionsListKybPartyDraftsResponse) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end + it "sessions.list_networks sends GET /v3/organization/{organization_id}/application/{application_id}/sessions/{session_id}/networks/" do calls = stub_api(status: 200, body: <<~'JSON') { @@ -2283,7 +2547,7 @@ "entity_type": "person", "hits": [ { - "id": "cPtTGRKkyddAcAC4xgsLCm", + "id": "hit_7c1e9a40b2d35f86e0a4c912", "url": "https://news.example.org/articles/sample", "match": false, "score": 0.73, @@ -2988,18 +3252,50 @@ exercise_readers(result) end + it "sessions.submit_kyb_parties sends POST /v3/session/{sessionId}/kyb/parties/submit/" do + calls = stub_api(status: 200, body: <<~'JSON') + { + "valid": true, + "next_step": "FINISHED", + "status": "In Progress", + "advanced": true, + "already_submitted": false, + "kyb_key_people_status": "In Progress", + "parties": [] + } + JSON + result = client.sessions.submit_kyb_parties( + "33333333-4444-5555-6666-777777777777", + locale: "es" + ) + request = expect_api_request( + calls, + method: :post, + url: "https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/parties/submit/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_json_body(request, { + "locale" => "es" + }) + expect(result).to be_a(Didit::Types::SessionsSubmitKybPartiesResponse) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end + it "sessions.update_aml_hit_status sends PATCH /v3/session/{sessionId}/update-aml-hit-status/" do calls = stub_api(status: 200, body: <<~'JSON') { "message": "Hit status updated successfully", - "hit_id": "abc123", + "hit_id": "hit_7c1e9a40b2d35f86e0a4c912", "review_status": "False Positive" } JSON result = client.sessions.update_aml_hit_status( "11111111-2222-3333-4444-555555555555", - hit_id: "abc123", - review_status: "Unreviewed", + hit_id: "hit_7c1e9a40b2d35f86e0a4c912", + review_status: "False Positive", node_id_query: "feature_aml_1" ) request = expect_api_request( @@ -3016,8 +3312,8 @@ accept: "application/json" ) expect_json_body(request, { - "hit_id" => "abc123", - "review_status" => "Unreviewed" + "hit_id" => "hit_7c1e9a40b2d35f86e0a4c912", + "review_status" => "False Positive" }) expect(result).to be_a(Didit::Types::SessionsUpdateAmlHitStatusResponse) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) @@ -3373,6 +3669,48 @@ exercise_readers(result) end + it "sessions.update_kyb_party_draft sends PATCH /v3/session/{sessionId}/kyb/parties/drafts/{draftId}/" do + calls = stub_api(status: 200, body: <<~'JSON') + { + "draft_id": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d", + "created_at": "2026-10-31T10:00:00Z", + "updated_at": "2026-10-31T10:00:00Z", + "party": { + "entity_type": "person", + "first_name": "Ana", + "last_name": "Lopez", + "roles": [ + "ubo", + "director" + ], + "ownership_percent": 55, + "nationality": "MEX", + "email": "ana.lopez@example.com", + "date_of_birth": "1984-06-12" + } + } + JSON + result = client.sessions.update_kyb_party_draft( + "33333333-4444-5555-6666-777777777777", + "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d", + ownership_percent: 55 + ) + request = expect_api_request( + calls, + method: :patch, + url: "https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/parties/drafts/5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_json_body(request, { + "ownership_percent" => 55 + }) + expect(result).to be_a(Didit::Types::SessionsUpdateKybPartyDraftResponse) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end + it "sessions.update_poa_data sends PATCH /v3/session/{sessionId}/update-poa-data/" do calls = stub_api(status: 200, body: <<~'JSON') { @@ -3494,6 +3832,42 @@ exercise_readers(result) end + it "sessions.upload_kyb_documents sends POST /v3/session/{sessionId}/kyb/documents/" do + calls = stub_api(status: 200, body: <<~'JSON') + { + "valid": true, + "next_step": "KYB_KEY_PEOPLE", + "kyb_status": "In Progress" + } + JSON + result = client.sessions.upload_kyb_documents( + "33333333-4444-5555-6666-777777777777", + documents: Didit::FilePart.new("fake-documents-bytes", filename: "documents.jpg", content_type: "image/jpeg") + ) + request = expect_api_request( + calls, + method: :post, + url: "https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/documents/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_multipart_body( + request, + fields: {}, + files: { + "documents" => [ + "documents.jpg", + "image/jpeg", + "fake-documents-bytes" + ] + } + ) + expect(result).to be_a(Didit::Types::SessionsUploadKybDocumentsResponse) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end + it "sessions.imports.cancel sends POST /v3/session/imports/{importId}/cancel/" do calls = stub_api(status: 200, body: <<~'JSON') { @@ -3566,7 +3940,8 @@ result = client.sessions.imports.check_provider( provider: "sumsub", credentials: { - key: "value" + app_token: "redacted-app_token", + secret_key: "redacted-secret_key" } ) request = expect_api_request( @@ -3580,7 +3955,8 @@ expect_json_body(request, { "provider" => "sumsub", "credentials" => { - "key" => "value" + "app_token" => "redacted-app_token", + "secret_key" => "redacted-secret_key" } }) expect(result).to be_a(Didit::Types::SessionsImportsCheckProviderResponse) @@ -4107,6 +4483,10 @@ JSON result = client.sessions.imports.retry( "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", + credentials: { + app_token: "redacted-app_token", + secret_key: "redacted-secret_key" + }, file: Didit::FilePart.new("fake-file-bytes", filename: "file.jpg", content_type: "image/jpeg") ) request = expect_api_request( @@ -4119,7 +4499,9 @@ ) expect_multipart_body( request, - fields: {}, + fields: { + "credentials" => "{\"app_token\":\"redacted-app_token\",\"secret_key\":\"redacted-secret_key\"}" + }, files: { "file" => [ "file.jpg", @@ -4388,8 +4770,8 @@ "node_id": "node_id-value", "status": "intro", "verdict": "Not Finished", - "level": "aes", - "format": "pades", + "level": "simple", + "format": "pdf", "profile": "profile-value", "signer": { "name": "name-value", diff --git a/spec/generated/travel_rule_spec.rb b/spec/generated/travel_rule_spec.rb index fad7683..36d3165 100644 --- a/spec/generated/travel_rule_spec.rb +++ b/spec/generated/travel_rule_spec.rb @@ -1500,7 +1500,11 @@ "updated_at": "2026-01-02T03:04:05Z" } JSON - result = client.travel_rule.networks.update_questionnaire + result = client.travel_rule.networks.update_questionnaire( + legal_name: "Example VASP Ltd", + incorporation_country: "ES", + aml_ctf_policy_attested: true + ) request = expect_api_request( calls, method: :put, @@ -1509,7 +1513,11 @@ auth: :api_key, accept: "application/json" ) - expect_json_body(request, {}) + expect_json_body(request, { + "legal_name" => "Example VASP Ltd", + "incorporation_country" => "ES", + "aml_ctf_policy_attested" => true + }) expect(result).to be_a(Didit::Types::TravelRuleNetworkQuestionnaire) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) exercise_readers(result) @@ -1564,6 +1572,126 @@ exercise_readers(result.results) end + it "travel_rule.unmatched_deposits.list sends GET /v3/travel-rule/unmatched/" do + calls = stub_api(status: 200, body: <<~'JSON') + { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "id": "7d3a1c55-0b9e-4d52-8a3c-1f6e2b9d4a08", + "transaction_id": "c41f9b2e-5a8d-4e0c-9f17-3b6d8a2e5c91", + "txn_id": "dep-2026-10-20-0007", + "txn_date": "2026-10-19T08:41:12Z", + "kind": "deposit", + "direction": "INBOUND", + "status": "AWAITING_COUNTERPARTY", + "rail": "TRP", + "asset": "ETH", + "amount": "1.25", + "originator_vasp": "", + "beneficiary_vasp": "Example Counterparty VASP", + "originator_wallet": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7", + "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb", + "originator_memo": "", + "beneficiary_memo": "", + "originator_wallet_type": "vasp", + "beneficiary_wallet_type": "vasp", + "matched_transaction_id": null, + "deadline_at": null, + "created_at": "2026-10-19T08:41:13Z" + } + ] + } + JSON + result = client.travel_rule.unmatched_deposits.list + request = expect_api_request( + calls, + method: :get, + url: "https://verification.didit.me/v3/travel-rule/unmatched/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_no_body(request) + expect(result).to be_a(Didit::Page) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + expect(result.results).to all(be_a(Didit::Types::TravelRuleTransferRow)) + exercise_readers(result.results) + end + + it "travel_rule.unmatched_deposits.match sends POST /v3/travel-rule/unmatched/{transaction_uuid}/match/" do + calls = stub_api(status: 200, body: <<~'JSON') + { + "deposit": { + "id": "7d3a1c55-0b9e-4d52-8a3c-1f6e2b9d4a08", + "transaction_id": "c41f9b2e-5a8d-4e0c-9f17-3b6d8a2e5c91", + "txn_id": "dep-2026-10-20-0007", + "txn_date": "2026-10-19T08:41:12Z", + "kind": "deposit", + "direction": "INBOUND", + "status": "AWAITING_COUNTERPARTY", + "rail": "TRP", + "asset": "ETH", + "amount": "1.25", + "originator_vasp": "Example Counterparty VASP", + "beneficiary_vasp": "Example Counterparty VASP", + "originator_wallet": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7", + "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb", + "originator_memo": "", + "beneficiary_memo": "", + "originator_wallet_type": "vasp", + "beneficiary_wallet_type": "vasp", + "matched_transaction_id": "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24", + "deadline_at": null, + "created_at": "2026-10-19T08:41:13Z" + }, + "message": { + "id": "2b8e6f10-9c3a-47d1-b5e2-0a4c7d9f3e66", + "transaction_id": "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24", + "txn_id": "msg-2026-10-20-0003", + "txn_date": "2026-10-19T08:41:12Z", + "kind": "message", + "direction": "INBOUND", + "status": "COMPLETED", + "rail": "TRP", + "asset": "ETH", + "amount": "1.25", + "originator_vasp": "Origin CASP SL", + "beneficiary_vasp": "Example Counterparty VASP", + "originator_wallet": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7", + "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb", + "originator_memo": "", + "beneficiary_memo": "", + "originator_wallet_type": "vasp", + "beneficiary_wallet_type": "vasp", + "matched_transaction_id": null, + "deadline_at": "2026-10-21T08:41:13Z", + "created_at": "2026-10-19T08:41:13Z" + } + } + JSON + result = client.travel_rule.unmatched_deposits.match( + "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", + transaction_id: "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24" + ) + request = expect_api_request( + calls, + method: :post, + url: "https://verification.didit.me/v3/travel-rule/unmatched/3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b/match/", + query: [], + auth: :api_key, + accept: "application/json" + ) + expect_json_body(request, { + "transaction_id" => "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24" + }) + expect(result).to be_a(Didit::Types::TravelRuleManualMatchResponse) + expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) + exercise_readers(result) + end + it "travel_rule.wallet_addresses.bulk_import sends POST /v3/travel-rule/wallet-addresses/import/" do calls = stub_api(status: 200, body: <<~'JSON') { @@ -1811,7 +1939,8 @@ JSON result = client.travel_rule.wallet_proofs.decide( "3f1c2a9e-5b7d-4e2f-9a1b-6c8d0e4f2a7b", - decision: "approve" + decision: "approve", + note: "Address matches the wallet app." ) request = expect_api_request( calls, @@ -1822,7 +1951,8 @@ accept: "application/json" ) expect_json_body(request, { - "decision" => "approve" + "decision" => "approve", + "note" => "Address matches the wallet app." }) expect(result).to be_a(Didit::Types::TravelRuleWalletProofReview) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) diff --git a/spec/generated/users_spec.rb b/spec/generated/users_spec.rb index 29f213d..f214ffb 100644 --- a/spec/generated/users_spec.rb +++ b/spec/generated/users_spec.rb @@ -497,7 +497,10 @@ } JSON result = client.users.set_ongoing_monitoring( - is_enabled: true + is_enabled: true, + didit_internal_id_list: [ + "5b9a0000-0000-4000-8000-00000000f00d" + ] ) request = expect_api_request( calls, @@ -508,7 +511,10 @@ accept: "application/json" ) expect_json_body(request, { - "is_enabled" => true + "is_enabled" => true, + "didit_internal_id_list" => [ + "5b9a0000-0000-4000-8000-00000000f00d" + ] }) expect(result).to be_a(Didit::Types::OngoingMonitoringToggleResult) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) diff --git a/spec/generated/wallet_screening_spec.rb b/spec/generated/wallet_screening_spec.rb index beab548..5058e48 100644 --- a/spec/generated/wallet_screening_spec.rb +++ b/spec/generated/wallet_screening_spec.rb @@ -186,7 +186,7 @@ JSON result = client.wallet_screening.screen( wallet_address: "0x94f1b9b64e2932f6a2db338f616844400cd58e8a", - blockchain: "BTC" + blockchain: "ETH" ) request = expect_api_request( calls, @@ -198,7 +198,7 @@ ) expect_json_body(request, { "wallet_address" => "0x94f1b9b64e2932f6a2db338f616844400cd58e8a", - "blockchain" => "BTC" + "blockchain" => "ETH" }) expect(result).to be_a(Didit::Types::WalletScreeningResult) expect(result.to_h).to eq(JSON.parse(calls.body, symbolize_names: true)) diff --git a/spec/generated/workflows_spec.rb b/spec/generated/workflows_spec.rb index 6ecf272..b0c97c2 100644 --- a/spec/generated/workflows_spec.rb +++ b/spec/generated/workflows_spec.rb @@ -293,6 +293,11 @@ ], "created_at": "2026-01-02T03:04:05Z", "updated_at": "2026-01-02T03:04:05Z", + "signature_availability": { + "simple": true, + "aes": true, + "qes": true + }, "is_bank_verification_enabled": true, "bank_verification_config": {}, "is_geolocation_enabled": true,