openapi: 3.0.0 info: title: Number Verify - KPN description: >- With KPN Number Verify, you can quickly check whether the mobile number someone provides is the same as their SIM card. **Important Notes:** - It is advised to use **Postman** for testing this API, as it involves a redirect call. SwaggerHub does not handle redirect flows well. - Please **download this Swagger file** and import it into your Postman client for best results. --- **Testing the `/session` endpoint:** - Make sure that the call is made using your mobile client or via the hostspot. - In **Postman**, disable **automatic redirects** to ensure the `Location` header is visible in the response. - In **cURL**, avoid using the `--location` flag. A correct example request: ```bash curl -v GET https://api-prd.kpn.com/communication/kpn/numberverify/session/bc74adca8f761******* ``` --- ## [Source view](https://app.swaggerhub.com/apis/kpn/match-kpn/)
[Documentation view](https://app.swaggerhub.com/apis-docs/kpn/match-kpn/) --- ## [KPN API Store](https://developer.kpn.com/)
[Getting Started](https://developer.kpn.com/getting-started) --- contact: name: API Support email: api_developer@kpn.com url: 'https://developer.kpn.com/support' termsOfService: 'https://developer.kpn.com/legal' version: 1.2.1 servers: - url: https://api-prd.kpn.com/communication/kpn/numberverify - description: SwaggerHub API Auto Mocking url: https://virtserver.swaggerhub.com/kpn/NumberVerify-KPN/1.2.1 paths: /token: post: summary: Token Request requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object required: - client_id - client_secret - scopes properties: client_id: type: string description: Your client ID example: your client id client_secret: type: string description: Your client secret example: your client secret scopes: type: string description: | - Scopes determine what the token can access. Valid scopes include `operator_lookup`, `device_match`, and `device_match_notify`. - device_match_notify scope should be used for *Notification* and device_match for *Polling*. - Choose either device_match or device_match_notify at a time - Enter the values in a comma-separated format. example: operator_lookup,device_match examples: credentials_scopes: summary: credentials value: client_id: your_client_id client_secret: your_client_secret scope: operator_lookup,device_match credentials_scopes_notify: summary: credentials + correlation_id value: client_id: your_client_id client_secret: your_client_secret scope: operator_lookup,device_match_notify responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/TokenResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Error' /insights/{msisdn}: post: summary: Insights Request parameters: - name: msisdn in: path required: true schema: type: string example: '31630000001' requestBody: required: true content: application/json: examples: polling: summary: Polling Example description: Body can be empty for polling value: {} notification: summary: Notification Example description: | - You will need to pass the “notification_token” which is used as the “bearer” token when posting the results to “notification_uri.” - To see the notification in the provided webhook, the session_uri must be accessed. value: device_match_notify: notification_token: "abcd1234" notification_uri: "https://your_webhook_url/" responses: '200': description: OK content: application/json: schema: oneOf: - $ref: '#/components/schemas/InsightsResponse' - $ref: '#/components/schemas/InsightsResponseNotify' examples: polling: summary: Polling Example value: device_match: session_id: "e46714d908600d8cf9f3abbf9f4056ff" polling_id: "e46714d908600d8cf9f3abbf9f4056ff" operator_lookup: regionCode: "NL" operatorName: "KPN" mcc: null mnc: null notification: summary: Notification Example description: | - You will need to pass the “notification_token” which is used as the “bearer” token when posting the results to “notification_uri.” - To see the notification in the provided webhook, the session_uri must be accessed. value: device_match_notify: session_uri: "http://server/v1/dm/session/5f563a0bbb61c93748f773b744bf19c6" operator_lookup: regionCode: "NL" operatorName: "KPN" mcc: null mnc: null '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/Error' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/Error' security: - BearerAuth: [] /session/{session_id}: get: summary: Session Request description: > Invoke the session using the session ID returned from the `/insights/{msisdn}` endpoint, specifically under the `device_match.session_id`. This endpoint returns a `302 Found` response with a `Location` header that the client must follow to continue the process. parameters: - name: session_id in: path required: true description: | The session ID extracted from the URI provided in the `/insights/{msisdn}` response. Example: `de32343b3fe474515429d487f6989628` schema: type: string example: 'de32343b3fe474515429d487f6989628' responses: '302': description: Found — The session was successfully initiated. The client must follow the `Location` header to continue. headers: Location: description: URL to follow to continue the session or retrieve further information. schema: type: string format: uri example: 'https://server/v1/dm/session/next-step' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Error' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/Error' /polling/{polling_id}: get: summary: Polling Request description: Retrieve the polling information using the `polling_id` provided in the header. parameters: - name: polling_id in: path required: true description: | - Enter the Polling Id you received in the response of `/insights/{msisdn}`, specifically located under the `device_match/polling_id` field. schema: type: string example: 'e46714d908600d8cf9f3abbf9f4056ff' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/PollingResponse' examples: polling: summary: Polling Example value: msisdn: "316xxxxxxxx" device_match: null remote_addr: "xx.xx.x.xx" user_agent: "Mozilla/5.0..." errors: - device_match: "AVAILABLE or UNAVAILABLE" '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Error' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/Error' security: - BearerAuth: [] components: securitySchemes: BearerAuth: type: http scheme: bearer bearerFormat: JWT schemas: TokenRequest: type: object properties: client_id: type: string client_secret: type: string scopes: type: array items: type: string description: Scopes determine what the token can access. TokenResponse: type: object properties: access_token: type: string example: "ewuriwerewrew" token_type: type: string example: "Bearer" expires_in: type: integer example: 3600 Error: type: object properties: error_code: type: integer description: HTTP status code representing the error example: 400 enum: - 400 # Bad Request - 401 # Unauthorized - 403 # Forbidden - 404 # Not Found - 405 # Method Not Allowed - 412 # Precondition Failed - 429 # Too Many Requests - 500 # Internal Server Error - 502 # Bad Gateway - 503 # Service Unavailable message: type: string description: A short description of the error example: Bad Request enum: - Bad Request - Unauthorized - Forbidden - Not Found - Method Not Allowed - Precondition Failed - Too Many Requests - Internal Server Error - Bad Gateway - Service Unavailable InsightsRequest: type: object properties: device_match_notify: type: object properties: notification_token: type: string example: 'asf32423432' notification_uri: type: string example: 'https://your-webhook-endpoint' InsightsResponse: type: object properties: device_match: type: object properties: session_uri: type: string example: "http://server/v1/dm/session/e46714d908600d8cf9f3abbf9f4056ff" polling_uri: type: string example: "https://server/v1/dm/polling/e46714d908600d8cf9f3abbf9f4056ff" description: Polling would only work when the /token flow has device_match in scopes, and notification would work as expected only when the scopes have device_match_notify. operator_lookup works in both examples. operator_lookup: type: object properties: regionCode: type: string example: "NL" operatorName: type: string example: "KPN" mcc: type: string nullable: true example: null mnc: type: string nullable: true example: null InsightsResponseNotify: type: object properties: device_match_notify: type: object properties: session_uri: type: string example: "http://server/v1/dm/session/5f563a0bbb61c93748f773b744bf19c6" description: To see the notification in the provided webhook, the session_uri must be accessed. Also, notification would work as expected only when the scopes have device_match_notify. operator_lookup: type: object properties: regionCode: type: string example: "NL" operatorName: type: string example: "KPN" mcc: type: string nullable: true example: null SessionResponse: type: object properties: status: type: string example: "OK" PollingResponse: type: object properties: msisdn: type: string example: "31620028461" device_match: type: string nullable: true example: null remote_addr: type: string example: "199.103.8.50" user_agent: type: string example: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" errors: type: array items: type: object properties: device_match: type: string example: "AVAILABLE"