Skip to content

chore: update v3 OpenAPI specs to v3.772.0 - #29

Merged
Ed Fricker (beastawakens) merged 1 commit into
mainfrom
sync/v3.772.0
Jul 24, 2026
Merged

chore: update v3 OpenAPI specs to v3.772.0#29
Ed Fricker (beastawakens) merged 1 commit into
mainfrom
sync/v3.772.0

Conversation

@beastawakens

@beastawakens Ed Fricker (beastawakens) commented Jul 24, 2026

Copy link
Copy Markdown
Member

User description

Automated v3 OpenAPI spec update for v3.772.0.

Triggered by Ed Fricker (@beastawakens) - assigned to you in case it needs a manual merge.


PR Type

Enhancement


Description

  • Add full bundled openapi.yaml spec covering all v3 API endpoints

  • Add "Full V3 API" entry to docs spec selector

  • Standardize Consent schema descriptions and add https:// pattern across all entry specs

  • Update CHANGELOG for v3.772.0 release


Diagram Walkthrough

flowchart LR
  A["openapi.yaml (new)"] -- "bundled spec" --> B["All v3 endpoints"]
  C["Entry specs"] -- "standardized" --> D["Consent schema"]
  E["docs/index.html"] -- "added" --> F["Full V3 API option"]
Loading

File Walkthrough

Relevant files
Documentation
8 files
CHANGELOG.md
Add v3.772.0 changelog entry listing updated specs             
+13/-0   
v3-biometric-authentication-entry.yaml
Add descriptions, examples, and https pattern to Consent 
+8/-0     
v3-biometric-enrollment-entry.yaml
Standardize Consent schema formatting and descriptions     
+5/-8     
v3-biometric-kyc-entry.yaml
Standardize Consent schema formatting and descriptions     
+5/-8     
v3-document-verification-entry.yaml
Standardize Consent schema formatting and descriptions     
+5/-8     
v3-enhanced-document-verification-entry.yaml
Standardize Consent schema formatting and descriptions     
+5/-8     
v3-enhanced-kyc-entry.yaml
Standardize Consent schema formatting and descriptions     
+5/-8     
v3-smart-selfie-compare-entry.yaml
Add descriptions, examples, and https pattern to Consent 
+8/-0     
Enhancement
2 files
index.html
Add "Full V3 API" spec to documentation selector                 
+1/-0     
openapi.yaml
Add complete bundled OpenAPI spec for all v3 endpoints     
+3419/-0


Need help?
  • Type /help how to ... in the comments thread for any questions about PR-Agent usage.
  • Check out the documentation for more information.
  • @beastawakens
    Ed Fricker (beastawakens) merged commit a5fa6b9 into main Jul 24, 2026
    1 check passed
    @beastawakens
    Ed Fricker (beastawakens) deleted the sync/v3.772.0 branch July 24, 2026 08:20
    @prfectionist

    prfectionist Bot commented Jul 24, 2026

    Copy link
    Copy Markdown

    PR Reviewer Guide 🔍

    Here are some key observations to aid the review process:

    ⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
    🏅 Score: 85
    🧪 No relevant tests
    🔒 No security concerns identified
    🔀 No multiple PR themes
    ⚡ Recommended focus areas for review

    Missing Required

    The required field was moved from a multi-line list format to an inline array format on the same line as the key, but the old multi-line required block was removed. If the YAML parser sees the new required: [...] on line 338 correctly this is fine, but the diff shows the old required: block (with items on separate lines) being deleted and replaced with a single inline required: [...]. This is functionally equivalent and not a bug, just a style change.

    required: [granted, granted_at, notice_language, notice_privacy_policy_url]
    Inconsistent Path Parameter

    The /v3/replay/{job_id} path uses job_id (with underscore) as the path parameter name, while /v3/status/{jobId} uses jobId (camelCase). This inconsistency in parameter naming across related endpoints could confuse SDK code generators and API consumers.

    /v3/replay/{job_id}:
      post:
        operationId: replayCallback
        tags:
          - Callback Replay
        security:
          - SmileIDToken: []
        summary: Replay a callback for a completed verification
        description: >-
          Looks up a previously completed verification by its TypeID, resolves the callback URL, and
          re-sends the callback. The verification must have reached a terminal state (clear, block,
          attention, or error) before its callback can be replayed.
    
          An optional `callback_url` in the request body overrides the stored URL, subject to the
          partner's callback domain allowlist.
        parameters:
          - name: job_id
            in: path
            required: true
            description: TypeID format verification identifier with 'job_' prefix.
            schema:
              type: string
              pattern: ^job_[0-9a-z]{26}$
              example: job_01h2xcejqtf2nbrexx3vqjhp41
        requestBody:
          required: false
          description: >-
            Optional body to override the callback URL. If omitted, the stored callback URL (from the
            original verification or partner default) is used.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReplayCallbackRequest'
              example:
                callback_url: https://partner.example.com/webhook
        responses:
          '202':
            description: Callback replay accepted and queued for delivery.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ReplayCallbackResponse'
                example:
                  status: accepted
                  job_id: job_01h2xcejqtf2nbrexx3vqjhp41
                  user_id: test-user
                  message: Callback replay queued successfully.
          '400':
            description: >-
              Bad Request — invalid job_id format, unrecognised product, or no valid callback URL
              available.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                examples:
                  invalidJobId:
                    summary: Invalid TypeID format
                    value:
                      status: Bad Request
                      message: '"job_id" must be a valid TypeID with prefix ''job_'''
                  noCallbackUrl:
                    summary: No callback URL resolvable
                    value:
                      status: Bad Request
                      message: No valid callback URL available
                  unknownProduct:
                    summary: Product cannot be inferred
                    value:
                      status: Bad Request
                      message: Unable to determine product for this verification
          '401':
            description: Unauthorized — invalid or missing authentication credentials.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  status: Unauthorized
                  message: Invalid authentication credentials.
          '403':
            description: >-
              Forbidden — IP not in allowlist, callback URL not in allowed domains, or security checks
              failed.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  status: Forbidden
                  message: You are not authorized to do that.
          '404':
            description: >-
              Not Found — verification does not exist, does not belong to this partner, or has no
              reference entry.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                examples:
                  jobNotFound:
                    summary: Verification not found or belongs to another partner
                    value:
                      status: Not Found
                      message: Verification not found
                  referenceNotFound:
                    summary: Reference entry missing for the verification
                    value:
                      status: Not Found
                      message: Reference not found for this verification
          '409':
            description: >-
              Conflict — verification has not yet reached a terminal state. Wait for processing to
              complete before replaying the callback.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  status: Conflict
                  message: >-
                    Verification is still processing. Callbacks can only be replayed for completed
                    verifications.
          '500':
            description: Internal Server Error
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  status: Internal Server Error
                  message: An unexpected error occurred. Please try again or contact support.
    /v3/users/{user_id}/report_fraud:
      post:
        operationId: reportUserFraud
        tags:
          - Users
        summary: Flag or clear fraud status for a user
        description: |
          Records a fraud report (or fraud-clearance) for a previously enrolled
          user.
    
          Use `is_fraud: true` to flag a user as fraudulent, or `is_fraud: false`
          to clear a previous flag. Flagging propagates the user's face, device,
          and biometric clusters to the relevant block lists so that subsequent
          verifications matching them are rejected. Clearing the flag reverses
          these effects.
    
          The response is `202 Accepted` once the request has been validated
          and handled.
        security:
          - SmileIDToken: []
        parameters:
          - name: user_id
            in: path
            required: true
            description: |
              The partner-scoped user identifier of the enrolled user being
              reported. This is the `user_id` value originally provided during
              enrollment.
            schema:
              type: string
            example: user-123
        requestBody:
          required: true
          content:
            multipart/form-data:
              schema:
                $ref: '#/components/schemas/ReportUserFraudRequest'
              examples:
                flagFirstParty:
                  summary: Flag a user (reason only)
                  value:
                    is_fraud: true
                    reason: FIRST_PARTY_FRAUD
                    reported_by: risk@partner.example
                flagWithNotes:
                  summary: Flag a user with optional notes
                  value:
                    is_fraud: true
                    reason: ACCOUNT_TAKEOVER
                    notes: Confirmed via partner internal review
                    reported_by: risk@partner.example
                flagOther:
                  summary: Flag a user with reason=OTHER (notes required)
                  value:
                    is_fraud: true
                    reason: OTHER
                    notes: Bespoke fraud pattern observed by internal review
                    reported_by: risk@partner.example
                clearFlag:
                  summary: Clear a previous fraud flag (notes required)
                  value:
                    is_fraud: false
                    notes: Cleared by appeals review
                    reported_by: risk@partner.example
        responses:
          '202':
            description: Fraud report accepted and queued for processing.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ReportUserFraudAcceptedResponse'
                example:
                  status: accepted
                  message: Fraud report accepted
                  user_id: user-123
          '400':
            description: |
              Validation error. Possible causes:
              - `user_id` path parameter is missing.
              - `is_fraud` is missing or not a boolean.
              - `reason` is missing when `is_fraud` is `true`, or is not one of
                the allowed values.
              - `notes` is missing when `is_fraud` is `false` or `reason` is
                `OTHER`.
              - `notes` exceeds 500 characters.
              - `reported_by` is missing or is not a valid email address.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                examples:
                  missingReason:
                    summary: Missing reason when flagging
                    value:
                      message: Required field 'reason' is missing or invalid.
                      status: Bad Request
                  invalidReason:
                    summary: Unrecognised reason value
                    value:
                      message: >-
                        Field 'reason' must be one of: FIRST_PARTY_FRAUD, SECOND_PARTY_FRAUD,
                        THIRD_PARTY_FRAUD, SYNTHETIC_IDENTITY, ACCOUNT_TAKEOVER, DOCUMENT_FORGERY,
                        IDENTITY_FARMING, MULE_ACCOUNT, OTHER.
                      status: Bad Request
                  missingNotesOnUnblock:
                    summary: Missing notes when clearing
                    value:
                      message: Required field 'notes' is missing or invalid when is_fraud is false.
                      status: Bad Request
                  missingNotesOnOther:
                    summary: Missing notes when reason=OTHER
                    value:
                      message: Required field 'notes' is missing or invalid when reason is 'OTHER'.
                      status: Bad Request
                  notesTooLong:
                    summary: Notes exceed maximum length
                    value:
                      message: Field 'notes' must be at most 500 characters.
                      status: Bad Request
                  invalidEmail:
                    summary: Invalid reporter email
                    value:
                      message: Field 'reported_by' must be a valid email address.
                      status: Bad Request
          '401':
            description: Authentication failed (invalid or missing token).
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  message: Invalid token
                  status: Unauthorized
          '403':
            description: |
              Access denied. Possible causes:
              - IP address is on the blocklist.
              - IP not in partner's allowlist.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  message: You are not authorized to do that.
                  status: Forbidden
          '404':
            description: No enrollee found for the given `user_id` and partner.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  message: User not found
                  status: Not Found
          '415':
            description: |
              Wrong or missing `Content-Type` header. The request body must be
              sent as `multipart/form-data`.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  message: Unsupported Media Type. Required Content-Type is multipart/form-data
                  status: Unsupported Media Type
          '500':
            description: Unexpected server error.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  message: System Error
                  status: Internal Server Error
    /v3/services/bank_codes:
      get:
        operationId: getBankCodes
        tags:
          - Services
        summary: List bank codes
        description: |
          Returns a list of bank codes supported for bank-account-based identity
          verification. Optionally filtered by country.
        security: []
        parameters:
          - $ref: '#/components/parameters/CountryFilter'
        responses:
          '200':
            description: Successful response containing bank codes.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/BankCodesResponse'
                example:
                  bank_codes:
                    - code: '044'
                      country: NG
                      name: Access Bank
                    - code: '023'
                      country: NG
                      name: Citibank
          '403':
            description: Request blocked (IP blocked).
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ServiceErrorResponse'
                example:
                  error: You are not authorized to do that.
                  code: '2413'
    /v3/services/supported_id_types:
      get:
        operationId: getSupportedIdTypes
        tags:
          - Services
        summary: List supported KYC ID types
        description: |
          Returns a list of all KYC ID types supported for identity verification,
          including their validation regex, required fields, and optional bank code.
          Optionally filtered by country.
        security: []
        parameters:
          - $ref: '#/components/parameters/CountryFilter'
        responses:
          '200':
            description: Successful response containing supported ID types.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/SupportedIdTypesResponse'
                example:
                  id_types:
                    - country: NG
                      label: Bank Verification Number
                      regex: ^\d{11}$
                      required_fields:
                        - first_name
                        - last_name
                        - dob
                      type: BVN
                    - bank_code: '044'
                      country: NG
                      label: Bank Account (Access Bank)
                      regex: ^\d{10}$
                      required_fields:
                        - first_name
                        - last_name
                      type: BANK_ACCOUNT
          '403':
            description: Request blocked (IP blocked).
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ServiceErrorResponse'
                example:
                  error: You are not authorized to do that.
                  code: '2413'
    /v3/services/supported_documents:
      get:
        operationId: getSupportedDocuments
        tags:
          - Services
        summary: List supported documents for verification
        description: |
          Returns a list of supported document types for identity verification across all
          countries served by Smile Identity.
    
          The response can be filtered by continent or country code. An optional `locale`
          parameter controls the language of document names.
    
          This endpoint does not require authentication. It is an alias of
          `GET /v1/valid_documents` and `GET /v3/valid-documents`.
        security: []
        parameters:
          - name: continent
            in: query
            required: false
            description: Filter results to a single continent.
            schema:
              type: string
              enum:
                - AFRICA
                - ASIA
                - EUROPE
                - NORTH AMERICA
                - OCEANIA
                - SOUTH AMERICA
            example: AFRICA
          - name: country_code
            in: query
            required: false
            description: |
              Filter results to a single country. Must be an ISO 3166-1 alpha-2 code
              (two uppercase letters).
            schema:
              type: string
              pattern: ^[A-Z]{2}$
            example: NG
          - name: locale
            in: query
            required: false
            description: |
              Locale for document names. Defaults to `en-GB`.
              Supported values: `en-GB`, `fr-FR`, `ar-EG`.
            schema:
              type: string
              default: en-GB
              enum:
                - en-GB
                - fr-FR
                - ar-EG
        responses:
          '200':
            description: List of supported documents, optionally filtered.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/SupportedDocumentsResponse'
                example:
                  valid_documents:
                    - country:
                        code: NG
                        name: Nigeria
                        continent: AFRICA
                      id_types:
                        - code: DRIVERS_LICENSE
                          name: Driver's License
                          example:
                            - AAA00000AA00
                          has_back: true
                        - code: NATIONAL_ID
                          name: National ID (NIN Slip)
                          example:
                            - '00000000000'
                          has_back: false
          '400':
            description: Invalid query parameters.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ServiceErrorResponse'
                example:
                  error: >-
                    Country Code must be a valid ISO 3166-1 alpha-2 country code consisting of exactly
                    two uppercase letters.
                  code: '2413'
          '500':
            description: Internal server error.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ServiceErrorResponse'
                example:
                  error: System Error
                  code: '2401'
    /v3/services/id_status:
      get:
        operationId: getIdStatus
        tags:
          - Services
        summary: Get ID type availability status
        description: |
          Returns the current availability and success rate for a specific ID type
          in a given country, based on uptime data from the last hour.
    
          Requires authentication via JWT token.
        security:
          - SmileIDToken: []
        parameters:
          - name: country
            in: query
            required: true
            description: ISO 3166-1 alpha-2 country code or full country name (e.g. "NG" or "Nigeria").
            schema:
              type: string
              example: NG
          - name: id_type
            in: query
            required: true
            description: The ID type code to check status for (e.g. "BVN", "NIN", "VOTER_ID").
            schema:
              type: string
              example: BVN
        responses:
          '200':
            description: ID status retrieved successfully.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/IdStatusResponse'
                example:
                  last_checked: '2026-04-14T12:30:00.000Z'
                  last_check_status: success
                  last_hour_success_rate: 95%
                  last_known_status: online
                  last_check_success_rate: 90%
          '400':
            description: Bad request – missing or invalid parameters, or no uptime data found.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/IdStatusErrorResponse'
                examples:
                  missingCountry:
                    summary: Country parameter missing
                    value:
                      message: '"country" is required'
                      status: Bad Request
                  invalidCountry:
                    summary: Invalid country value
                    value:
                      message: Invalid country
                      status: Bad Request
                  invalidIdType:
                    summary: ID type not valid for country
                    value:
                      message: Invalid id_type for the given country
                      status: Bad Request
                  noData:
                    summary: No uptime data in the last hour
                    value:
                      message: No data found. Check that NG and BVN are valid inputs
                      status: Bad Request
          '401':
            description: Authentication failed.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/IdStatusErrorResponse'
                example:
                  message: Invalid token
                  status: Unauthorized
    /v3/compare:
      post:
        summary: Submit smart selfie compare
        operationId: v3SmartSelfieCompare
        tags:
          - Smart Selfie Compare
        security:
          - SmileIDToken: []
        description: >-
          Compares a selfie image against a provided comparison image (document, ID photo, or
          portrait). The images are uploaded, validated at entry, then queued for async ML processing
          (passive liveness, face matching, optional active liveness with liveness images). Results
          are delivered via callback URL.
    
          If `user_id` is provided and the comparison passes, the user will be enrolled.
        parameters:
          - name: SmileID-Source-SDK
            in: header
            required: false
            description: Source SDK identifier.
            schema:
              type: string
              example: ios
          - name: SmileID-Source-SDK-Version
            in: header
            required: false
            description: Source SDK version.
            schema:
              type: string
              example: 10.3.1
          - name: SmileID-Timestamp
            in: header
            required: false
            x-smile-sdk-exclude: true
            description: ISO 8601 timestamp used as the salt when computing SmileID-Request-Signature.
            schema:
              type: string
              format: date-time
          - name: SmileID-Request-Signature
            in: header
            required: false
            x-smile-sdk-exclude: true
            description: HMAC signature of the raw HTTP request body.
            schema:
              type: string
          - name: User-ID
            in: header
            required: false
            description: Partner-provided user identifier. If omitted, a TypeID is generated automatically.
            schema:
              type: string
        requestBody:
          required: true
          content:
            multipart/form-data:
              schema:
                $ref: '#/components/schemas/SmartSelfieCompareRequest'
              encoding:
                selfie_image:
                  contentType: image/jpeg
                comparison_image:
                  contentType: image/jpeg
                liveness_images:
                  contentType: image/jpeg
        responses:
          '202':
            description: Accepted — job queued for async processing.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/AcceptedResponse'
                example:
                  status: accepted
                  message: Request accepted and queued for processing.
                  job_id: job_01h8x9y2z3a4b5c6d7e8f9g0h1
                  user_id: user_01h8x9y2z3a4b5c6d7e8f9g0h1
                  created_at: '2026-03-10T12:00:00.000Z'
          '400':
            description: Bad Request — validation error.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                examples:
                  missingCallbackUrl:
                    summary: Missing callback_url and no default set
                    value:
                      status: Bad Request
                      message: >-
                        A valid callback_url is required in the request or a default callback URL must
                        be configured in the portal.
                  missingSelfie:
                    summary: Missing selfie image
                    value:
                      status: Bad Request
                      message: Required field 'selfie_image' is missing or invalid.
                  missingComparisonImage:
                    summary: Missing comparison image
                    value:
                      status: Bad Request
                      message: Required field 'comparison_image' is missing or invalid.
                  invalidComparisonType:
                    summary: Invalid comparison image type
                    value:
                      status: Bad Request
                      message: Field 'comparison_image_type' must be either DOCUMENT, ID_PHOTO, or PORTRAIT.
                  missingContact:
                    summary: Missing email and phone
                    value:
                      status: Bad Request
                      message: Either email or phone_number is required.
          '401':
            description: Unauthorized — invalid or missing authentication credentials.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
          '402':
            description: Payment Required — insufficient wallet balance.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
          '403':
            description: Forbidden — partner not authorized for this product or IP.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
          '415':
            description: Unsupported Media Type — request must be multipart/form-data.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
          '429':
            description: Too Many Requests — rate limit exceeded.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
          '500':
            description: Internal Server Error
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
    /v3/token:
      post:
        operationId: getV3Token
        tags:
          - Authentication
        summary: Generate v3 Auth Token
        description: Issues a short-lived JWT for authenticating subsequent v3 API requests.
        parameters:
          - name: smileid-partner-id
            in: header
            required: true
            description: Your unique partner identifier. Must be numeric with no leading zeros.
            schema:
              type: string
              pattern: ^[1-9]\d*$
              example: '1234'
          - name: smileid-api-key
            in: header
            required: true
            description: Your partner API key for authentication.
            schema:
              type: string
              example: abcd1234key
        requestBody:
          description: Optional parameters to be included in the generated token.
          required: false
          content:
            multipart/form-data:
              schema:
                type: object
                properties:
                  user_id:
                    type: string
                    description: Optional partner-provided user identifier.
                  partner_params:
                    type: object
                    additionalProperties:
                      type: string
                    description: Key-value metadata for partner reference.
                    example:
                      pi: '3.14159265359'
                  product:
                    type: string
                    description: The product or service the token will be used for.
                    enum:
                      - aml
                      - basic_kyc
                      - one_time_aml
                      - biometric_kyc
                      - address_verification
                      - document_verification
                      - enhanced_document_verification
                      - enhanced_kyc
                      - phone_number_verification
                      - smart_selfie_authentication
                      - smart_selfie_registration
                      - smart_selfie_compare
                    example: smart_selfie_authentication
                  payload:
                    type: object
                    description: >-
                      Optional identity fields to bind into the token. PII fields (id_number,
                      given_names, last_name, email, phone_number) are validated as plaintext, then
                      tokenized via the PII vault — the issued JWT carries opaque `pii_`-prefixed
                      vault token ids, never raw PII. country and id_type stay plaintext in the claim,
                      and callback_url is replaced by a resolvable `callback_`-prefixed id. Downstream
                      v3 endpoints inject these fields server-side, overriding any matching fields in
                      the request body, so identity data bound to the token cannot be altered by the
                      client. Fields provided here make the corresponding request body fields optional
                      on downstream endpoints; GET /v3/services/config lists them as
                      `token_provided_fields`.
                    properties:
                      country:
                        type: string
                        description: >-
                          Country code or name. Accepts ISO 3166-1 alpha-2 codes (e.g. "NG") or full
                          country names (e.g. "Nigeria"). Normalized to uppercase ISO 3166-1 alpha-2
                          on the server. If id_type is also provided, the country/id_type combination
                          is validated.
                        example: NG
                      id_type:
                        type: string
                        description: >-
                          ID document type (e.g., NIN, BVN, DRIVERS_LICENSE). If country is also
                          provided, the combination is validated against known ID types.
                        example: NIN
                      id_number:
                        type: string
                        description: >-
                          ID document number. If country and id_type are also provided, the format is
                          validated against the expected regex pattern.
                        example: '12345678901'
                      given_names:
                        type: string
                        description: Given name(s) / first name of the individual.
                        example: John
                      last_name:
                        type: string
                        description: Last name / surname of the individual.
                        example: Doe
                      email:
                        type: string
                        format: email
                        description: Email address of the individual.
                        example: john@example.com
                      phone_number:
                        type: string
                        description: Phone number in E.164 format.
                        example: '+2348012345678'
                      callback_url:
                        type: string
                        description: >-
                          URL to receive the async result callback, or a `callback_`-prefixed id from
                          a previously issued token. Overrides the callback_url in the request body of
                          downstream endpoints.
                        example: https://example.com/callback
        responses:
          '200':
            description: Success
            content:
              application/json:
                schema:
                  type: object
                  properties:
                    token:
                      type: string
                      description: JWT token for authenticating subsequent v3 API requests.
                      example: ey...
          '400':
            description: Bad Request
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  status: Bad Request
                  message: smileid-partner-id header is required.
          '401':
            description: Unauthorized
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  status: Unauthorized
                  message: Invalid authentication credentials.
          '415':
            description: Unsupported Media Type — request body, if provided, must be multipart/form-data.
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  status: Unsupported Media Type
                  message: Unsupported Media Type. Required Content-Type is multipart/form-data
          '500':
            description: Internal Server Error
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/ApiErrorResponse'
                example:
                  status: Internal Server Error
                  message: An unexpected error occurred. Please try again or contact support.
    /v3/status/{jobId}:
      get:
        operationId: getVerificationStatus
        tags:
          - Verification Status
        security:
          - SmileIDToken: []
        summary: Get verification status
        description: >-
          Retrieves the current status of a previously submitted verification. Returns the latest
          state from the verification lifecycle (processing, clear, block, attention, error).
        parameters:
          - name: jobId
            in: path
            required: true
            description: TypeID format verification identifier with 'job_' prefix.
            schema:
              type: string
              pattern: ^job_[0-9a-hjkmnp-tv-z]{26}$
              example: job_01h2xcejqtf2nbrexx3vqjhp41

    Comment thread specs/v3/openapi.yaml
    Comment on lines +3026 to +3033
    ReportUserFraudRequest:
    type: object
    required:
    - is_fraud
    - reported_by
    properties:
    is_fraud:
    type: boolean

    Copy link
    Copy Markdown

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Suggestion: The ReportUserFraudRequest schema has additionalProperties: true, which allows arbitrary unknown fields to be submitted. For a security-sensitive endpoint that flags users as fraudulent, this could lead to injection of unexpected data into downstream processing. Consider setting additionalProperties: false to enforce a strict schema. [security, importance: 6]

    Suggested change
    ReportUserFraudRequest:
    type: object
    required:
    - is_fraud
    - reported_by
    properties:
    is_fraud:
    type: boolean
    ReportUserFraudRequest:
    type: object
    required:
    - is_fraud
    - reported_by
    additionalProperties: false
    properties:
    is_fraud:
    type: boolean

    Comment thread specs/v3/openapi.yaml
    Comment on lines +1907 to +1913
    - name: smileid-api-key
    in: header
    required: true
    description: Your partner API key for authentication.
    schema:
    type: string
    example: abcd1234key

    Copy link
    Copy Markdown

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Suggestion: The smileid-api-key header parameter for the /v3/token endpoint should include x-sensitive: true or use OpenAPI's security scheme mechanism rather than a plain header parameter. As defined, code generators and documentation tools will display this as a regular parameter, potentially encouraging logging or caching of the secret API key. [security, importance: 5]

    Suggested change
    - name: smileid-api-key
    in: header
    required: true
    description: Your partner API key for authentication.
    schema:
    type: string
    example: abcd1234key
    - name: smileid-api-key
    in: header
    required: true
    description: Your partner API key for authentication. Treat as a secret — do not log or cache.
    schema:
    type: string
    format: password
    example: abcd1234key

    Comment thread specs/v3/openapi.yaml
    Comment on lines +1196 to +1203
    - name: job_id
    in: path
    required: true
    description: TypeID format verification identifier with 'job_' prefix.
    schema:
    type: string
    pattern: ^job_[0-9a-z]{26}$
    example: job_01h2xcejqtf2nbrexx3vqjhp41

    Copy link
    Copy Markdown

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Suggestion: The jobId path parameter pattern uses ^job_[0-9a-hjkmnp-tv-z]{26}$ (TypeID base32 alphabet), but the /v3/replay/{job_id} endpoint uses ^job_[0-9a-z]{26}$ (full lowercase alphanumeric). These inconsistent patterns will cause validation failures if a valid TypeID job_id is passed to the other endpoint. Both should use the same pattern — the TypeID spec uses Crockford base32 ([0-9a-hjkmnp-tv-z]). [possible issue, importance: 8]

    Suggested change
    - name: job_id
    in: path
    required: true
    description: TypeID format verification identifier with 'job_' prefix.
    schema:
    type: string
    pattern: ^job_[0-9a-z]{26}$
    example: job_01h2xcejqtf2nbrexx3vqjhp41
    - name: job_id
    in: path
    required: true
    description: TypeID format verification identifier with 'job_' prefix.
    schema:
    type: string
    pattern: ^job_[0-9a-hjkmnp-tv-z]{26}$
    example: job_01h2xcejqtf2nbrexx3vqjhp41

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Projects

    None yet

    Development

    Successfully merging this pull request may close these issues.

    1 participant