> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymorfa.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Check call

> **Required scope:** `sessions:read`

Runs the checks a call placement runs, without calling: the number's calling switch, the team's do-not-call list and blocked country codes, and on Cloud API numbers the person's call permission and WhatsApp's call limits. If WhatsApp's permission status is unavailable and no other refusal is known, returns 503 service_unavailable. Server credentials only.



## OpenAPI

````yaml api-reference/features/communicate.json POST /messaging/voip/calls/check
openapi: 3.0.3
info:
  title: Communicate API methods
  version: 1.0.0
  description: >-
    Task-focused communicate methods across supported Polymorfa connection
    types.
servers: []
security: []
paths:
  /messaging/voip/calls/check:
    post:
      tags:
        - Calls
      summary: Check call
      description: >-
        **Required scope:** `sessions:read`


        Runs the checks a call placement runs, without calling: the number's
        calling switch, the team's do-not-call list and blocked country codes,
        and on Cloud API numbers the person's call permission and WhatsApp's
        call limits. If WhatsApp's permission status is unavailable and no other
        refusal is known, returns 503 service_unavailable. Server credentials
        only.
      operationId: nativeCheckCall
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/native__CallCheckRequest'
      responses:
        '200':
          description: Check result.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/native__CheckCallResponse'
        '400':
          description: Bad request — request body or params failed validation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/native__PublicError'
              example:
                error:
                  type: invalid_request_error
                  code: invalid_parameter
                  message: Correct the invalid request field.
                  param: null
                  request_id: 5f0c2a8e-3b1d-4c6f-9e2a-7d4b1c8f6a30
                data: null
                docs: https://docs.polymorfa.com/api/errors#invalid-parameter
        '401':
          description: Missing or invalid authentication token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/native__PublicError'
              example:
                error:
                  type: authentication_error
                  code: invalid_credential
                  message: Supply a valid credential.
                  param: null
                  request_id: 5f0c2a8e-3b1d-4c6f-9e2a-7d4b1c8f6a30
                data: null
                docs: https://docs.polymorfa.com/api/errors#invalid-credential
        '403':
          description: Authenticated but not permitted (missing scope or rule violation)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/native__PublicError'
              example:
                error:
                  type: permission_error
                  code: permission_denied
                  message: The credential does not have access to this resource.
                  param: null
                  request_id: 5f0c2a8e-3b1d-4c6f-9e2a-7d4b1c8f6a30
                data: null
                docs: https://docs.polymorfa.com/api/errors#permission-denied
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/native__PublicError'
              example:
                error:
                  type: invalid_request_error
                  code: resource_not_found
                  message: The resource is unavailable to this caller.
                  param: null
                  request_id: 5f0c2a8e-3b1d-4c6f-9e2a-7d4b1c8f6a30
                data: null
                docs: https://docs.polymorfa.com/api/errors#resource-not-found
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/native__PublicError'
              example:
                error:
                  type: api_error
                  code: internal_error
                  message: >-
                    An unexpected service failure occurred. Keep the request ID
                    for support.
                  param: null
                  request_id: 5f0c2a8e-3b1d-4c6f-9e2a-7d4b1c8f6a30
                data: null
                docs: https://docs.polymorfa.com/api/errors#internal-error
        '503':
          description: >-
            `service_unavailable`: required call-check state is unavailable;
            retry later.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/native__PublicError'
              example:
                error:
                  type: api_error
                  code: service_unavailable
                  message: >-
                    A required service is unavailable. Check completion before
                    repeating a write.
                  param: null
                  request_id: 5f0c2a8e-3b1d-4c6f-9e2a-7d4b1c8f6a30
                data: null
                docs: https://docs.polymorfa.com/api/errors#service-unavailable
      security:
        - native__BearerAuth: []
      servers:
        - url: https://api.polymorfa.com
components:
  schemas:
    native__CallCheckRequest:
      type: object
      properties:
        session:
          type: string
          minLength: 1
          maxLength: 128
          description: |-
            The session (number) that would place the call.

            <!-- polymorfa-input-table -->
            **Value constraints**
            | Constraint | Accepted input |
            | --- | --- |
            | String length | `1` through `128` characters |
        to:
          type: string
          minLength: 1
          maxLength: 64
          description: |-
            User ID or phone number in E.164 format.

            <!-- polymorfa-input-table -->
            **Value constraints**
            | Constraint | Accepted input |
            | --- | --- |
            | String length | `1` through `64` characters |
      required:
        - session
        - to
      additionalProperties: false
    native__CheckCallResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
          description: |-
            Whether the request succeeded.

            <!-- polymorfa-input-table -->
            **Allowed values**
            | Value | Meaning |
            | --- | --- |
            | `true` | True. |
        data:
          allOf:
            - $ref: '#/components/schemas/native__CallCheck'
          description: Structured data carried by this object.
      required:
        - success
        - data
    native__PublicError:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
              enum:
                - invalid_request_error
                - authentication_error
                - permission_error
                - conflict_error
                - rate_limit_error
                - api_error
                - upstream_error
              description: |-
                Type discriminator for this object.

                <!-- polymorfa-input-table -->
                **Allowed values**
                | Value | Meaning |
                | --- | --- |
                | `invalid_request_error` | Invalid request error. |
                | `authentication_error` | Authentication error. |
                | `permission_error` | Permission error. |
                | `conflict_error` | Conflict error. |
                | `rate_limit_error` | Rate limit error. |
                | `api_error` | Api error. |
                | `upstream_error` | Upstream error. |
            code:
              type: string
              enum:
                - invalid_parameter
                - invalid_credential
                - entitlement_required
                - gate_limit_reached
                - method_not_allowed
                - permission_denied
                - missing_scope
                - resource_not_found
                - hms_not_enabled
                - media_fetch_failed
                - resource_gone
                - feature_unavailable
                - stream_cursor_invalid
                - stream_cursor_expired
                - stream_connection_limit_reached
                - state_conflict
                - idempotency_conflict
                - idempotency_in_progress
                - idempotency_completed
                - idempotency_outcome_unknown
                - call_claimed
                - call_not_ringing
                - connection_limit
                - unsupported_for_connection
                - call_permission_required
                - invalid_sip_trunk
                - calls_disabled
                - call_recipient_opted_out
                - call_destination_blocked
                - call_permission_request_limited
                - call_permission_granted
                - call_opt_out_limit
                - number_restricted
                - sip_trunk_in_use
                - sip_trunk_revision_conflict
                - sip_trunk_limit
                - sip_unavailable
                - voice_not_enabled
                - provider_credential_invalid
                - provider_unavailable
                - asset_not_ready
                - voice_asset_in_use
                - voice_asset_revision_conflict
                - voice_unavailable
                - rate_limit_exceeded
                - internal_error
                - operation_not_supported
                - upstream_failure
                - service_unavailable
                - credential_verification_unavailable
                - session_not_ready
                - command_dispatch_failed
                - result_unknown
                - recipient_not_on_whatsapp
                - conversation_window_closed
                - template_not_approved
                - media_too_large
                - whatsapp_rate_limited
                - new_chat_limit_reached
                - whatsapp_account_restricted
                - bansafe_suspended
                - bansafe_org_suspended
                - bansafe_cold_blocked
                - bansafe_cold_held
                - bansafe_throttled
                - bansafe_daily_allowance_reached
                - bansafe_accounting_unavailable
                - bansafe_send_outcome_unknown
                - campaigns_not_entitled
                - campaign_throughput_capped
              description: >-
                Stable machine-readable code for this result.


                <!-- polymorfa-input-table -->

                **Allowed values**

                | Value | Meaning |

                | --- | --- |

                | `invalid_parameter` | Invalid parameter. |

                | `invalid_credential` | Invalid credential. |

                | `entitlement_required` | Entitlement required. |

                | `gate_limit_reached` | Gate limit reached. |

                | `method_not_allowed` | Method not allowed. |

                | `permission_denied` | Permission denied. |

                | `missing_scope` | Missing scope. |

                | `resource_not_found` | Resource not found. |

                | `hms_not_enabled` | Hms not enabled. |

                | `media_fetch_failed` | Media fetch failed. |

                | `resource_gone` | Resource gone. |

                | `feature_unavailable` | Feature unavailable. |

                | `stream_cursor_invalid` | Stream cursor invalid. |

                | `stream_cursor_expired` | Stream cursor expired. |

                | `stream_connection_limit_reached` | Stream connection limit
                reached. |

                | `state_conflict` | State conflict. |

                | `idempotency_conflict` | Idempotency conflict. |

                | `idempotency_in_progress` | Idempotency in progress. |

                | `idempotency_completed` | Idempotency completed. |

                | `idempotency_outcome_unknown` | Idempotency outcome unknown. |

                | `call_claimed` | Call claimed. |

                | `call_not_ringing` | Call not ringing. |

                | `connection_limit` | Connection limit. |

                | `unsupported_for_connection` | Unsupported for connection. |

                | `call_permission_required` | Call permission required. |

                | `invalid_sip_trunk` | Invalid sip trunk. |

                | `calls_disabled` | Calls disabled. |

                | `call_recipient_opted_out` | Call recipient opted out. |

                | `call_destination_blocked` | Call destination blocked. |

                | `call_permission_request_limited` | Call permission request
                limited. |

                | `call_permission_granted` | Call permission granted. |

                | `call_opt_out_limit` | Call opt out limit. |

                | `number_restricted` | Number restricted. |

                | `sip_trunk_in_use` | Sip trunk in use. |

                | `sip_trunk_revision_conflict` | Sip trunk revision conflict. |

                | `sip_trunk_limit` | Sip trunk limit. |

                | `sip_unavailable` | Sip unavailable. |

                | `voice_not_enabled` | Voice not enabled. |

                | `provider_credential_invalid` | Provider credential invalid. |

                | `provider_unavailable` | Provider unavailable. |

                | `asset_not_ready` | Asset not ready. |

                | `voice_asset_in_use` | Voice asset in use. |

                | `voice_asset_revision_conflict` | Voice asset revision
                conflict. |

                | `voice_unavailable` | Voice unavailable. |

                | `rate_limit_exceeded` | Rate limit exceeded. |

                | `internal_error` | Internal error. |

                | `operation_not_supported` | Operation not supported. |

                | `upstream_failure` | Upstream failure. |

                | `service_unavailable` | Service unavailable. |

                | `credential_verification_unavailable` | Credential
                verification unavailable. |

                | `session_not_ready` | Session not ready. |

                | `command_dispatch_failed` | Command dispatch failed. |

                | `result_unknown` | Result unknown. |

                | `recipient_not_on_whatsapp` | Recipient not on whatsapp. |

                | `conversation_window_closed` | Conversation window closed. |

                | `template_not_approved` | Template not approved. |

                | `media_too_large` | Media too large. |

                | `whatsapp_rate_limited` | Whatsapp rate limited. |

                | `new_chat_limit_reached` | New chat limit reached. |

                | `whatsapp_account_restricted` | Whatsapp account restricted. |

                | `bansafe_suspended` | Bansafe suspended. |

                | `bansafe_org_suspended` | Bansafe org suspended. |

                | `bansafe_cold_blocked` | Bansafe cold blocked. |

                | `bansafe_cold_held` | Bansafe cold held. |

                | `bansafe_throttled` | Bansafe throttled. |

                | `bansafe_daily_allowance_reached` | Bansafe daily allowance
                reached. |

                | `bansafe_accounting_unavailable` | Bansafe accounting
                unavailable. |

                | `bansafe_send_outcome_unknown` | Bansafe send outcome unknown.
                |

                | `campaigns_not_entitled` | Campaigns not entitled. |

                | `campaign_throughput_capped` | Campaign throughput capped. |
            message:
              type: string
              description: Human-readable message associated with this result.
            param:
              type: string
              nullable: true
              description: |-
                Specifies param for this error.

                <!-- polymorfa-input-table -->
                **Accepted alternatives**
                | Alternative | Accepted input |
                | --- | --- |
                | Alternative 1 | Type: `string` |
                | Alternative 2 | `null` |
            request_id:
              type: string
              description: >-
                Matches the X-Request-Id response header. Include it when you
                contact support.
            request_log_url:
              type: string
              format: uri
              description: >-
                Console page that shows this request. Returned only to
                organization and project credentials whose request was logged.


                <!-- polymorfa-input-table -->

                **Value constraints**

                | Constraint | Accepted input |

                | --- | --- |

                | Format | `uri` |
          required:
            - type
            - code
            - message
            - param
            - request_id
          description: Error details returned when the operation fails.
        data:
          type: string
          nullable: true
          enum:
            - null
          description: |-
            Always null for a failed request.

            <!-- polymorfa-input-table -->
            **Allowed values**
            | Value | Meaning |
            | --- | --- |
            | `null` | Null. |

            **Accepted alternatives**
            | Alternative | Accepted input |
            | --- | --- |
            | Alternative 1 | Type: `string` |
            | Alternative 2 | `null` |
        docs:
          type: string
          format: uri
          description: |-
            Specifies docs for this native public error.

            <!-- polymorfa-input-table -->
            **Value constraints**
            | Constraint | Accepted input |
            | --- | --- |
            | Format | `uri` |
      required:
        - error
        - data
        - docs
    native__CallCheck:
      type: object
      properties:
        allowed:
          type: boolean
          description: >-
            Whether a call placed now would pass every check Polymorfa and
            WhatsApp report.
        refusal:
          type: string
          nullable: true
          enum:
            - calls_disabled
            - call_recipient_opted_out
            - call_destination_blocked
            - call_permission_required
            - call_limit_reached
            - null
          description: >-
            The first reason the call would be refused, or null.


            <!-- polymorfa-input-table -->

            **Allowed values**

            | Value | Meaning |

            | --- | --- |

            | `calls_disabled` | Calls disabled. |

            | `call_recipient_opted_out` | Call recipient opted out. |

            | `call_destination_blocked` | Call destination blocked. |

            | `call_permission_required` | Call permission required. |

            | `call_limit_reached` | Call limit reached. |

            | `null` | Null. |


            **Accepted alternatives**

            | Alternative | Accepted input |

            | --- | --- |

            | Alternative 1 | Type: `string`; Value `calls_disabled` or
            `call_recipient_opted_out` or `call_destination_blocked` or
            `call_permission_required` or `call_limit_reached` |

            | Alternative 2 | `null` |
        permission:
          type: object
          nullable: true
          properties:
            status:
              type: string
              enum:
                - none
                - temporary
                - permanent
                - revoked
              description: >-
                `none`: no permission. `temporary`: granted until `expiresAt`.
                `permanent`: granted without expiry. `revoked`: the person
                declined or withdrew permission, or WhatsApp withdrew it after
                unanswered calls.


                <!-- polymorfa-input-table -->

                **Allowed values**

                | Value | Meaning |

                | --- | --- |

                | `none` | None. |

                | `temporary` | Temporary. |

                | `permanent` | Permanent. |

                | `revoked` | Revoked. |
            expiresAt:
              type: string
              nullable: true
              format: date-time
              description: |-
                When a temporary permission ends; null otherwise.

                <!-- polymorfa-input-table -->
                **Accepted alternatives**
                | Alternative | Accepted input |
                | --- | --- |
                | Alternative 1 | Type: `string`; Format: `date-time` |
                | Alternative 2 | `null` |

                **Value constraints**
                | Constraint | Accepted input |
                | --- | --- |
                | Format | `date-time` |
            source:
              type: string
              nullable: true
              enum:
                - user_action
                - automatic
                - sync
                - call_refused
                - null
              description: >-
                How the last change was learned: the person's reply
                (`user_action`), WhatsApp acting on its own (`automatic`),
                asking WhatsApp (`sync`), or a call WhatsApp refused for lack of
                permission (`call_refused`). Null when nothing is recorded.


                <!-- polymorfa-input-table -->

                **Allowed values**

                | Value | Meaning |

                | --- | --- |

                | `user_action` | User action. |

                | `automatic` | Automatic. |

                | `sync` | Sync. |

                | `call_refused` | Call refused. |

                | `null` | Null. |


                **Accepted alternatives**

                | Alternative | Accepted input |

                | --- | --- |

                | Alternative 1 | Type: `string`; Value `user_action` or
                `automatic` or `sync` or `call_refused` |

                | Alternative 2 | `null` |
            updatedAt:
              type: string
              nullable: true
              format: date-time
              description: |-
                When the status last changed, or null.

                <!-- polymorfa-input-table -->
                **Accepted alternatives**
                | Alternative | Accepted input |
                | --- | --- |
                | Alternative 1 | Type: `string`; Format: `date-time` |
                | Alternative 2 | `null` |

                **Value constraints**
                | Constraint | Accepted input |
                | --- | --- |
                | Format | `date-time` |
            checkedAt:
              type: string
              nullable: true
              format: date-time
              description: |-
                When WhatsApp was last asked, or null.

                <!-- polymorfa-input-table -->
                **Accepted alternatives**
                | Alternative | Accepted input |
                | --- | --- |
                | Alternative 1 | Type: `string`; Format: `date-time` |
                | Alternative 2 | `null` |

                **Value constraints**
                | Constraint | Accepted input |
                | --- | --- |
                | Format | `date-time` |
            fresh:
              type: boolean
              description: >-
                True when WhatsApp was asked during this request. False means
                the stored state is returned because WhatsApp could not be
                reached.
            actions:
              type: object
              nullable: true
              properties:
                requestPermission:
                  allOf:
                    - $ref: '#/components/schemas/native__CallPermissionAction'
                  description: >-
                    Specifies request permission for this action.


                    <!-- polymorfa-input-table -->

                    **Accepted alternatives**

                    | Alternative | Accepted input |

                    | --- | --- |

                    | Alternative 1 | Type: `object`; Required fields:
                    `allowed`, `limits` |

                    | Alternative 2 | `null` |
                startCall:
                  allOf:
                    - $ref: '#/components/schemas/native__CallPermissionAction'
                    - description: >-
                        Whether this number can call the person now, with
                        WhatsApp's limits.
                  description: >-
                    Specifies start call for this action.


                    <!-- polymorfa-input-table -->

                    **Accepted alternatives**

                    | Alternative | Accepted input |

                    | --- | --- |

                    | Alternative 1 | Type: `object`; Required fields:
                    `allowed`, `limits` |

                    | Alternative 2 | `null` |
              required:
                - requestPermission
                - startCall
              additionalProperties: false
              description: >-
                WhatsApp's limits, present when `fresh` is true.


                <!-- polymorfa-input-table -->

                **Accepted alternatives**

                | Alternative | Accepted input |

                | --- | --- |

                | Alternative 1 | Type: `object`; Required fields:
                `requestPermission`, `startCall` |

                | Alternative 2 | `null` |
          required:
            - status
            - expiresAt
            - source
            - updatedAt
            - checkedAt
            - fresh
            - actions
          additionalProperties: false
          description: >-
            The person's call permission on a Cloud API number; null on
            linked-device numbers.


            <!-- polymorfa-input-table -->

            **Accepted alternatives**

            | Alternative | Accepted input |

            | --- | --- |

            | Alternative 1 | Type: `object`; Field `status`: `none` or
            `temporary` or `permanent` or `revoked`; Field `source`:
            `user_action` or `automatic` or `sync` or `call_refused` or `null`;
            Required fields: `status`, `expiresAt`, `source`, `updatedAt`,
            `checkedAt`, `fresh`, `actions` |

            | Alternative 2 | `null` |
      required:
        - allowed
        - refusal
        - permission
      additionalProperties: false
    native__CallPermissionAction:
      type: object
      nullable: true
      properties:
        allowed:
          type: boolean
          description: Whether WhatsApp allows the action now.
        limits:
          type: array
          items:
            $ref: '#/components/schemas/native__CallPermissionLimit'
          description: Limits associated with this native call permission action.
      required:
        - allowed
        - limits
      additionalProperties: false
      description: >-
        Whether this number can send the person a call permission request now,
        with WhatsApp's limits.
    native__CallPermissionLimit:
      type: object
      properties:
        period:
          type: string
          description: ISO 8601 duration of the window, for example `PT24H` or `P7D`.
        maxAllowed:
          type: integer
          minimum: 0
          description: |-
            Specifies max allowed for this native call permission limit.

            <!-- polymorfa-input-table -->
            **Value constraints**
            | Constraint | Accepted input |
            | --- | --- |
            | Numeric value | `0` or greater |
        used:
          type: integer
          minimum: 0
          description: |-
            Specifies used for this native call permission limit.

            <!-- polymorfa-input-table -->
            **Value constraints**
            | Constraint | Accepted input |
            | --- | --- |
            | Numeric value | `0` or greater |
        resetsAt:
          type: string
          nullable: true
          format: date-time
          description: |-
            When the window resets, when WhatsApp reports it.

            <!-- polymorfa-input-table -->
            **Accepted alternatives**
            | Alternative | Accepted input |
            | --- | --- |
            | Alternative 1 | Type: `string`; Format: `date-time` |
            | Alternative 2 | `null` |

            **Value constraints**
            | Constraint | Accepted input |
            | --- | --- |
            | Format | `date-time` |
      required:
        - period
        - maxAllowed
        - used
        - resetsAt
      additionalProperties: false
  securitySchemes:
    native__BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Polymorfa organization key (pmfa_ prefix), project token (pmfa_pt_
        prefix) where supported, or short-lived client token (pmfa_ct_ prefix).
        Organization and project keys may be personal or service-account owned
        and enforce selected action scopes. Organization keys cover the team and
        its projects; project tokens stay inside one project. Client tokens stay
        inside their live project and session and enforce their client rules.

````