{"openapi":"3.0.3","info":{"title":"RandaVerify Partner API","version":"2.0","description":"The RandaVerify partner API: NIN verification for systems that embed identity\nchecks into their own flows.\n\n### Authenticating\n\nTwo ways, and they share one credential. An API key can be sent directly:\n\n    Authorization: Bearer rv_live_<key_id>_<secret>\n\nor exchanged at `POST /oauth/token` for a short-lived token, using the key's\n`key_id` as `client_id` and its secret as `client_secret`. Use whichever suits\nyour stack; they resolve to the same partner and the same scopes.\n\nA key beginning `rv_test_` is a sandbox key. It is answered by the fixture\nengine: no registry call, no units, and nothing it writes counts as real\ntraffic. Going live is a change of key and nothing else.\n\n### Conventions that apply everywhere\n\n* **Errors** always look the same: a stable `code`, a human `message`, and a\n  `retryable` flag. Branch on the code, never on the message. `GET /v2/errors`\n  lists every code.\n* **Idempotency**: send `Idempotency-Key` on a POST and a retry returns the\n  first result instead of charging you twice.\n* **Formats**: send `Accept: application/xml` (or `?format=xml`) for XML. Same\n  data, same shapes.\n* **Request ids**: every response carries `X-Request-Id`. Quote it to support\n  and we can find the exact call.\n* **Signing**: if your key requires signed requests, send `X-RV-Timestamp`,\n  `X-RV-Nonce` and `X-RV-Signature`. See the documentation site.\n\n### Fields\n\nWhat a verification returns depends on the field groups your organisation\nholds. The default is identity only. `GET /v2/fields` shows yours.","contact":{"name":"RandaVerify support","url":"https://docs.randaverify.com"}},"servers":[{"url":"https://api.randaverify.com","description":"Production"}],"security":[{"ApiKey":[]},{"OAuth2ClientCredentials":[]}],"tags":[{"name":"verification","description":"Asking the registry a question."},{"name":"webhooks","description":"Results delivered to you."},{"name":"reference","description":"Catalogues that save you asking us."}],"paths":{"/v2/sessions":{"post":{"summary":"Create Session","description":"Open a hosted verification and get the link to send the subject to.","operationId":"create_session_v2_sessions_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostedSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/sessions/{token}":{"get":{"summary":"Read Session","description":"How a session ended. Scoped to the caller's own organisation.","operationId":"read_session_v2_sessions__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/oauth/token":{"post":{"summary":"Issue Token","operationId":"issue_token_oauth_token_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_issue_token_oauth_token_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/me":{"get":{"summary":"Partner Identity","description":"What this credential is. The first call an integrator should make.","operationId":"partner_identity_v2_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/wallet":{"get":{"summary":"Partner Wallet","description":"Unit balance. Needs wallet:read, so it is also the proof that a scope a\ncredential does not hold is refused.","operationId":"partner_wallet_v2_wallet_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/sandbox/nins":{"get":{"summary":"Sandbox Catalogue","description":"What a test credential can call, and what each NIN demonstrates.\n\nAnswered for live credentials too, so an integrator can read it before\ntheir sandbox key exists, with a note saying it only applies in the\nsandbox.","operationId":"sandbox_catalogue_v2_sandbox_nins_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/requests":{"get":{"summary":"Partner Request History","description":"This partner's own recent API calls: what was called, how long it took,\nwhat came back.\n\nMetadata only. There are no NINs, names or photographs here by design: see\nrequest_log.py. Scoped to the caller's organisation, so a partner cannot\nread anyone else's traffic.","operationId":"partner_request_history_v2_requests_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"outcome","in":"query","required":false,"schema":{"type":"string","title":"Outcome"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/errors":{"get":{"summary":"Error Catalogue","description":"Every error code this API can return, with its status and whether it is\nworth retrying.\n\nServed rather than only documented, for the same reason the sandbox NIN\nlist is: a catalogue in a separate document drifts, and the most common\nintegration bug is retrying something that will never succeed. No\ncredential needed, because a client should be able to read this while\nworking out why its credential was refused.","operationId":"error_catalogue_v2_errors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/openapi.json":{"get":{"summary":"Openapi Document","description":"The partner API's OpenAPI 3.0 document.\n\nDerived from the running application rather than maintained by hand, and\nfiltered to the partner surface: the admin portal and the dashboards are\nnot a partner's business. No credential needed, because an integrator\nreads this before they have one.","operationId":"openapi_document_v2_openapi_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/verify/nin":{"post":{"summary":"Verify Nin V2","description":"Verify a NIN.\n\nSend an Idempotency-Key and a retry cannot charge twice. Omit it and each\ncall is a new verification, which is the right default for anyone\nlegitimately asking the same question again.","operationId":"verify_nin_v2_v2_verify_nin_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardVerification"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/fields":{"get":{"summary":"Field Catalogue","description":"Which field groups exist, and which this credential receives.\n\nServed so an integrator can see why a field is absent without asking us,\nwhich is the question field tiering otherwise generates.","operationId":"field_catalogue_v2_fields_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/verify/nin/async":{"post":{"summary":"Verify Nin Async","description":"Submit a verification and get a reference straight back.\n\nThe answer arrives at every webhook endpoint registered for this\nenvironment, and is also readable at GET /v2/verify/{reference}. A partner\nwith no endpoint registered can use this as a queue and poll, which is\nworse but not forbidden.","operationId":"verify_nin_async_v2_verify_nin_async_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardVerification"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/verify/{reference}":{"get":{"summary":"Verification Result","description":"What became of a verification, synchronous or asynchronous.\n\nScoped to the caller's organisation: another partner's reference answers\nexactly like one that does not exist.","operationId":"verification_result_v2_verify__reference__get","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/verify/{reference}/consent":{"get":{"summary":"Verification Consent","description":"What authorised this verification (Stage D4).\n\nThe acceptance criterion for D4 is that any verification can be traced to\nthe consent that authorised it, and this is that trace. Scoped to the\ncaller's own organisation: one partner must never be able to read what\nanother asserted.\n\nReturns every assertion made against the reference, newest first, because\na correction is a new row and the history of what was claimed is the part\nworth keeping.","operationId":"verification_consent_v2_verify__reference__consent_get","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/webhooks/deliveries":{"get":{"summary":"List Deliveries","description":"This partner's deliveries, newest first.\n\n`status=dead` is the dead letter view: the results we could not hand over.","operationId":"list_deliveries_v2_webhooks_deliveries_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}},"/v2/webhooks/deliveries/{delivery_id}/replay":{"post":{"summary":"Replay Delivery","description":"Ask for a delivery to be attempted again.\n\nQueues a new delivery rather than resetting the old one, so the record of\nwhat we tried and when is not rewritten.","operationId":"replay_delivery_v2_webhooks_deliveries__delivery_id__replay_post","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}},"default":{"description":"A refusal, in the standard error shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-Id":{"description":"Quote this to support.","schema":{"type":"string"}},"X-RandaVerify-Version":{"description":"The API contract version.","schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Body_create_organisation_admin_organisations_post":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"logo":{"type":"string","format":"binary","title":"Logo"},"primary_color":{"type":"string","title":"Primary Color","default":"#3B82F6"},"secondary_color":{"type":"string","title":"Secondary Color","default":"#64748B"},"admin_username":{"type":"string","title":"Admin Username"},"admin_email":{"type":"string","title":"Admin Email"},"admin_password":{"type":"string","title":"Admin Password"},"admin_telephone":{"type":"string","title":"Admin Telephone"},"tier_id":{"type":"integer","title":"Tier Id"},"custom_unit_cost":{"type":"number","title":"Custom Unit Cost"},"subscription_price":{"type":"number","title":"Subscription Price","default":500000.0},"escrow_id":{"type":"integer","title":"Escrow Id"}},"type":"object","required":["name","slug"],"title":"Body_create_organisation_admin_organisations_post"},"Body_hosted_submit_verify_session__token__post":{"properties":{"nin":{"type":"string","title":"Nin"},"consent":{"type":"string","title":"Consent"}},"type":"object","required":["nin"],"title":"Body_hosted_submit_verify_session__token__post"},"Body_initialize_topup_topup_initialize_post":{"properties":{"units":{"type":"integer","title":"Units"}},"type":"object","required":["units"],"title":"Body_initialize_topup_topup_initialize_post"},"Body_issue_token_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret"},"scope":{"type":"string","title":"Scope"}},"type":"object","title":"Body_issue_token_oauth_token_post"},"Body_login_login_post":{"properties":{"org_slug":{"type":"string","title":"Org Slug"},"grant_type":{"anyOf":[{"type":"string","pattern":"password"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_login_post"},"Body_update_org_branding_org_branding_put":{"properties":{"name":{"type":"string","title":"Name"},"primary_color":{"type":"string","title":"Primary Color"},"secondary_color":{"type":"string","title":"Secondary Color"},"logo":{"type":"string","format":"binary","title":"Logo"}},"type":"object","title":"Body_update_org_branding_org_branding_put"},"Body_update_organisation_admin_organisations__org_id__put":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"logo":{"type":"string","format":"binary","title":"Logo"},"primary_color":{"type":"string","title":"Primary Color"},"secondary_color":{"type":"string","title":"Secondary Color"},"admin_username":{"type":"string","title":"Admin Username"},"admin_email":{"type":"string","title":"Admin Email"},"admin_password":{"type":"string","title":"Admin Password"},"admin_telephone":{"type":"string","title":"Admin Telephone"},"tier_id":{"type":"integer","title":"Tier Id"},"custom_unit_cost":{"type":"number","title":"Custom Unit Cost"},"subscription_price":{"type":"number","title":"Subscription Price"},"field_groups":{"type":"string","title":"Field Groups"}},"type":"object","title":"Body_update_organisation_admin_organisations__org_id__put"},"Body_verify_subscription_subscribe_verify_post":{"properties":{"reference":{"type":"string","title":"Reference"}},"type":"object","required":["reference"],"title":"Body_verify_subscription_subscribe_verify_post"},"Body_verify_topup_topup_verify_post":{"properties":{"reference":{"type":"string","title":"Reference"}},"type":"object","required":["reference"],"title":"Body_verify_topup_topup_verify_post"},"ConsentAssertion":{"properties":{"lawful_basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lawful Basis"},"text_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Version"},"consented_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Consented At"},"subject_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject Ip"},"subject_user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject User Agent"}},"type":"object","title":"ConsentAssertion","description":"What the partner asserts authorised this verification (Stage D4).\n\nEvery field optional, because partners adopt this at different speeds and\na half-filled assertion is worth more than none. lawful_basis is the one\nthat matters: it is what an assertion means, and what require_consent\nchecks for."},"DemographyVerification":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"type":"string","title":"Date Of Birth"},"gender":{"type":"string","enum":["m","f"],"title":"Gender"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","default":"Identity Verification"}},"type":"object","required":["first_name","last_name","date_of_birth","gender"],"title":"DemographyVerification"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HostedSessionRequest":{"properties":{"return_url":{"type":"string","title":"Return Url"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purpose"},"ttl_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Minutes"}},"type":"object","required":["return_url"],"title":"HostedSessionRequest","description":"Open a hosted verification (Stage D5).\n\nreturn_url is where the subject is sent afterwards, with status and\nreference appended. It is checked like a webhook endpoint, because a\npartner can set it to anything and we are not going to become a redirector\nwearing somebody else's trusted domain."},"InPersonVerification":{"properties":{"nin":{"type":"string","title":"Nin"},"selfie_image":{"type":"string","title":"Selfie Image"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","default":"Identity Verification"}},"type":"object","required":["nin","selfie_image"],"title":"InPersonVerification"},"PasswordChange":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"PasswordChange"},"PasswordReset":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"PasswordReset"},"PhoneVerification":{"properties":{"phone_no":{"type":"string","title":"Phone No"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","default":"Identity Verification"}},"type":"object","required":["phone_no"],"title":"PhoneVerification"},"RegisterUser":{"properties":{"username":{"type":"string","title":"Username"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"telephone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telephone"},"organisation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organisation Id"},"roles":{"type":"string","title":"Roles","default":"IDENTITY,WALLET"}},"type":"object","required":["username","email","password"],"title":"RegisterUser"},"RequeryVerification":{"properties":{"reference_id":{"type":"string","title":"Reference Id"}},"type":"object","required":["reference_id"],"title":"RequeryVerification"},"ShareCodeVerification":{"properties":{"share_code":{"type":"string","title":"Share Code"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","default":"Identity Verification"}},"type":"object","required":["share_code"],"title":"ShareCodeVerification"},"StandardVerification":{"properties":{"nin":{"type":"string","title":"Nin"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","default":"Identity Verification"},"consent":{"anyOf":[{"$ref":"#/components/schemas/ConsentAssertion"},{"type":"null"}]}},"type":"object","required":["nin"],"title":"StandardVerification"},"UserUpdate":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"telephone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telephone"}},"type":"object","title":"UserUpdate"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyEmailRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailRequest"},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["idempotency_in_flight","idempotency_key_reused","insufficient_scope","insufficient_units","internal_error","invalid_request","nin_invalid","nin_not_found","not_found","not_implemented","organisation_suspended","rate_limited","signature_invalid","signature_required","unauthenticated","upstream_timeout","upstream_unavailable","validation_failed","verification_declined"],"description":"Stable. Branch on this."},"message":{"type":"string","description":"For a human. May be reworded at any time."},"retryable":{"type":"boolean","description":"Whether retrying could succeed."},"request_id":{"type":"string"},"catalogue":{"type":"string"},"detail":{"type":"object","additionalProperties":true}},"required":["code","message","retryable"]}},"required":["error"]}},"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","description":"An API key, sent directly: `Authorization: Bearer rv_live_...`"},"OAuth2ClientCredentials":{"type":"oauth2","description":"The same key, exchanged for a short-lived token.","flows":{"clientCredentials":{"tokenUrl":"/oauth/token","scopes":{"verify:nin":"Verify a NIN","verify:phone":"Verify by phone number","verify:demography":"Verify by demographic details","verify:sharecode":"Verify by share code","verify:inperson":"In person verification","verify:requery":"Re-query a previous verification","slip:read":"Download verification slips","wallet:read":"Read unit balance","usage:read":"Read call history and usage"}}}}}},"x-field-groups":[{"group":"address","fields":["address","residenceAddress","residenceAdress","residenceLga","residenceState","residenceTown","residence_AdressLine1"],"default":false},{"group":"contact","fields":["email","mobile","phone","telephone","telephoneno"],"default":false},{"group":"identity","fields":["NIN","birthdate","dateOfBirth","dob","firstname","fname","gender","lname","middlename","mname","nin","reference_id","status","surname","transaction_id"],"default":true},{"group":"maiden_name","fields":["maidenName","mothersMaidenName"],"default":false},{"group":"origin","fields":["lgaOfOrigin","nationality","placeOfOrigin","stateOfOrigin"],"default":false},{"group":"photograph","fields":["image","photo","picture","signature"],"default":false}],"x-error-codes":[{"code":"idempotency_in_flight","http_status":409,"message":"A request with this Idempotency-Key is still being processed.","retryable":true},{"code":"idempotency_key_reused","http_status":422,"message":"This Idempotency-Key was used for a different request.","retryable":false},{"code":"insufficient_scope","http_status":403,"message":"This credential does not hold the scope this endpoint needs.","retryable":false},{"code":"insufficient_units","http_status":402,"message":"Not enough units to perform this verification.","retryable":false},{"code":"internal_error","http_status":500,"message":"Something failed on our side. Quote the request id if you contact us.","retryable":true},{"code":"invalid_request","http_status":400,"message":"The request is malformed. See message.","retryable":false},{"code":"nin_invalid","http_status":400,"message":"That is not a valid NIN.","retryable":false},{"code":"nin_not_found","http_status":404,"message":"The registry holds no record for this NIN.","retryable":false},{"code":"not_found","http_status":404,"message":"No such resource.","retryable":false},{"code":"not_implemented","http_status":501,"message":"This endpoint is not available yet.","retryable":false},{"code":"organisation_suspended","http_status":403,"message":"This organisation is suspended.","retryable":false},{"code":"rate_limited","http_status":429,"message":"Too many requests. Slow down and retry.","retryable":true},{"code":"signature_invalid","http_status":401,"message":"The request signature could not be verified.","retryable":false},{"code":"signature_required","http_status":401,"message":"This key requires signed requests.","retryable":false},{"code":"unauthenticated","http_status":401,"message":"The credential is missing, malformed, revoked or expired.","retryable":false},{"code":"upstream_timeout","http_status":504,"message":"The identity registry did not answer in time. No unit was charged.","retryable":true},{"code":"upstream_unavailable","http_status":503,"message":"The identity registry is not responding. No unit was charged.","retryable":true},{"code":"validation_failed","http_status":422,"message":"One or more fields are invalid. See message.","retryable":false},{"code":"verification_declined","http_status":422,"message":"The registry declined this verification.","retryable":false}]}