openapi: 3.1.0 info: title: iDenfy IVS Core API version: 0.0.0 description: iDenfy Identity Verification Service's Core API documentation. contact: name: API Support url: https://idenfy-ivs.atlassian.net/servicedesk/customer/portal/1/group/-1 x-logo: url: /static/idenfy_logo.svg altText: iDenfy logo servers: - url: https://ivs.idenfy.com paths: /age-estimation/token/: post: operationId: ageEstimationTokenCreate summary: Create session description: Creates an age estimation session. Your Age Estimation finances are pre-checked; insufficient finances reject the request with `402`. tags: - Age Estimation requestBody: content: application/json: schema: $ref: '#/components/schemas/AgeEstimationTokenRequest' required: true security: - apiKeyPair: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/AgeEstimationToken' description: '' '402': content: application/json: schema: $ref: '#/components/schemas/InsufficientFinances' description: Age Estimation finances cannot cover the session. Note that insufficient funds return `402`, not `403`. components: schemas: AgeEstimationEscalationEnum: enum: - DOC - NONE type: string AgeEstimationStatusEnum: enum: - PENDING - PROCESSING - COMPLETED - FAILED - EXPIRED type: string AgeEstimationOutcomeEnum: enum: - SUCCESS - UNDERAGE - UNCERTAIN - FACE_MISMATCH - ATTEMPTS_EXCEEDED type: string AgeEstimationWebhookStatusEnum: enum: - COMPLETED - FAILED type: string AgeEstimationTokenRequest: type: object properties: min_age: type: integer minimum: 1 maximum: 120 description: Minimum age the end user must meet. confidence_threshold: type: number format: float minimum: 0 maximum: 100 description: Minimum model confidence to accept an estimate without a step-up. buffer: type: integer default: 0 minimum: 0 maximum: 20 description: Age band (in years) around `min_age` that triggers a step-up instead of an immediate decision. Must not exceed `min_age`. Applies to the AI estimate only, never to a document-derived age. escalation: allOf: - $ref: '#/components/schemas/AgeEstimationEscalationEnum' default: DOC description: Action when the estimate is uncertain. `DOC` = document step-up; `NONE` = resolve as `UNCERTAIN`. retry_limit: type: integer default: 3 minimum: 1 maximum: 3 description: Max estimation attempts before the session locks. save_photo: type: boolean default: true description: Whether the analysed selfie is stored for sessions from this token. expiry_minutes: type: integer default: 60 minimum: 5 maximum: 1440 description: Token validity window in minutes from creation. success_redirect: type: string format: uri maxLength: 2048 default: '' description: Redirect after a `SUCCESS` outcome (blank = built-in result screen). underage_redirect: type: string format: uri maxLength: 2048 default: '' description: Redirect after an `UNDERAGE` outcome. uncertain_redirect: type: string format: uri maxLength: 2048 default: '' description: Redirect after a terminal `UNCERTAIN` outcome. webhook_url: type: string format: uri maxLength: 2048 default: '' description: Per-session override for where the result notification is sent. Blank = use your account's default Age Estimation webhook notification. client_id: type: string maxLength: 100 nullable: true description: Your own identifier for the end user; echoed back in the result webhook for correlation. required: - min_age - confidence_threshold AgeEstimationToken: type: object properties: token: type: string readOnly: true description: Opaque session credential used by the capture page. session_url: type: string format: uri readOnly: true description: URL to send the end user to. expires_at: type: string format: date-time readOnly: true description: Absolute UTC expiry. min_age: type: integer confidence_threshold: type: number format: float buffer: type: integer escalation: $ref: '#/components/schemas/AgeEstimationEscalationEnum' retry_limit: type: integer save_photo: type: boolean expiry_minutes: type: integer client_id: type: string nullable: true required: - token - session_url - expires_at - min_age - confidence_threshold AgeEstimationWebhook: type: object properties: scanRef: type: string description: The step-up scan reference, or the token id when there is no scan ref. status: $ref: '#/components/schemas/AgeEstimationWebhookStatusEnum' outcome: allOf: - $ref: '#/components/schemas/AgeEstimationOutcomeEnum' nullable: true verdict: type: string nullable: true description: Model verdict (e.g. `ADULT`). estimatedAge: type: integer nullable: true description: The established age. When a document step-up produced an age, that exact document age is reported; otherwise it is the AI face-estimated age. confidence: type: number format: float nullable: true clientId: type: string nullable: true occurredAt: type: string format: date-time required: - scanRef - status - occurredAt MissingPoolFund: type: object properties: fund_pool: type: string description: Identifies which finances are short, e.g. `AGE_ESTIMATION`. missing: type: number format: float description: Shortfall in your account currency. `0` when no finances are configured for the feature at all, because nothing has been priced yet. required: - fund_pool - missing InsufficientFinancesDetail: type: object properties: detail: type: string missing_limits: type: array items: {} missing_additional_step_limits: type: array items: {} missing_funds: nullable: true description: General account funds only. Stays `null` when feature-specific finances are exhausted, so do not read it to detect that. missing_pool_funds: type: array items: $ref: '#/components/schemas/MissingPoolFund' description: Identifies which finances are short. This is the field to read for an Age Estimation shortfall. expired_expenses: type: array items: {} InsufficientFinances: type: object properties: message: type: string examples: - Action not allowed due to lack of funds or exceeded limit. code: type: string examples: - insufficient_finances detail: $ref: '#/components/schemas/InsufficientFinancesDetail' securitySchemes: apiKeyPair: type: http scheme: basic description: 'The request must contain basic auth headers where username is *API key* and password is *API secret*.
In order for you to start using our API you will need an **API key** and **API secret**.
Both can be retrieved by contacting *iDenfy''s support* or *iDenfy''s sales team*.' x-tagGroups: - name: Age Estimation tags: - Age Estimation - name: General tags: - Webhooks tags: - name: Age Estimation description: Age estimation session endpoints. - name: Webhooks description: Webhooks. externalDocs: description: For other/more docs on iDenfy services visit our main documentation page. url: https://documentation.idenfy.com webhooks: ageEstimationResult: post: operationId: ageEstimationResult description: This notification is sent when an age estimation session reaches a terminal state (either the estimate resolved, or a document step-up concluded). summary: Age estimation result externalDocs: description: Find info about webhook signing here. url: https://documentation.idenfy.com/security/CallbackSigning parameters: - in: header name: Idenfy-Event-Type schema: type: string enum: - AGE_ESTIMATION required: true - in: header name: Idenfy-Signature schema: type: string description: Webhook signature tags: - Webhooks requestBody: content: application/json: schema: $ref: '#/components/schemas/AgeEstimationWebhook' responses: '200': description: Return a 200 status to indicate that the data was received successfully.