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

# PHP SDK Universal API call

> Use the AvraAPI PHP SDK Universal Function for a released provider route that does not yet have a typed SDK method.

`ApixClient::call()` is the PHP SDK's Universal Function. Use it only when a
released provider route is not yet available through a typed service method.
For a service that already has a typed method, such as Currency, Security,
Location, SMS, or Utilities, use that typed method instead.

<Info>
  The Universal Function is for released **provider** routes. It is not a
  shortcut around the Universal Payment Gateway, payment completion, provider
  configuration, or browser-safety requirements.
</Info>

## SDK function

```php title="Copy the Universal Function signature" theme={null}
$response = $avraapi->call(
    method: 'GET_OR_POST',
    path: 'RELEASED_PROVIDER_ROUTE',
    payload: [],
);
```

| Argument | Use |
| - | - |
| `method` | `GET` or `POST`, case-insensitive. |
| `path` | A released provider route in any supported path format. |
| `payload` | Optional query parameters for `GET`, or a JSON request body for `POST`. |

The method returns `ApiResponse|BinaryResponse`. JSON responses expose their
operation result through `$response->data`; image or binary-media responses
use `BinaryResponse`, just as typed Utility methods do.

## Use a typed service whenever it exists

The following two calls reach the same released Currency route. The typed
method is clearer, validates its own inputs, and should be your default.

```php title="Preferred: typed SDK method" theme={null}
<?php

// AvraAPI SDK call.
$response = $avraapi->currency()->getCodes();

// Your application code.
$codes = $response->data['codes'];
```

```php title="Universal Function: supported fallback" theme={null}
<?php

// AvraAPI SDK call. GET payload values become query parameters.
$response = $avraapi->call('GET', 'utility/currency/codes');

// Your application code.
$codes = $response->data['codes'];
```

## Send a released POST operation

Use an exact released route and its documented body fields. This example uses
the public Security endpoint; normally, prefer
`$avraapi->security()->checkVpn()` for the same operation.

```php title="POST through the Universal Function" theme={null}
<?php

// AvraAPI SDK call.
$response = $avraapi->call('POST', 'security/vpn-shield', [
    'ip' => '194.195.93.1',
]);

// Your application code.
$isVpn = $response->data['is_vpn'];
$requestId = $response->requestId;
```

Refer to the [REST API Reference](/api-reference/overview) for the route's
request fields, response shape, billing rules, and error cases before using a
new provider operation.

## Path formats

The client normalises all of these forms before sending the request. Choose one
consistent form for your application; a short relative route is usually the
clearest.

```php title="Equivalent route paths" theme={null}
<?php

// Each call resolves to the configured AvraAPI base URL plus utility/currency/codes.
$avraapi->call('GET', 'utility/currency/codes');
$avraapi->call('GET', '/utility/currency/codes');
$avraapi->call('GET', '/api/v1/utility/currency/codes');
$avraapi->call('GET', 'https://avraapi.com/api/v1/utility/currency/codes');
```

The client removes a leading API version path and the host portion of a full
URL, then uses the configured `APIX_BASE_URL`. This is useful when moving a
verified route from the API Reference into your backend code.

## Response handling

Use the returned type before consuming the output. Most provider routes return
an `ApiResponse`; media routes can return `BinaryResponse`.

```php title="Handle a JSON or media result" theme={null}
<?php

use Avraapi\Apix\Responses\ApiResponse;
use Avraapi\Apix\Responses\BinaryResponse;

// AvraAPI SDK call. Use a released route and its documented payload.
$response = $avraapi->call('POST', 'utilities/qr/generate', [
    'data' => 'https://example.com/receipt/ORDER-001',
    'format' => 'png',
]);

// Your application code.
if ($response instanceof BinaryResponse) {
    $path = $response->saveAs(__DIR__.'/generated/receipt-qr.png');
} elseif ($response instanceof ApiResponse) {
    $data = $response->data;
}
```

## Boundaries and safety

<Warning>
  Do not use `call()` for payment initiation, payment completion, callbacks,
  gateway credentials, or any route that is not released in the public API
  Reference. Payment work uses the dedicated server-side
  [`payment()` service](/sdk/php/advanced-services).
</Warning>

`call()` sends the normal Project Client ID, Client Secret, and environment
headers. It does not expose fluent `withProvider()` or `withPrivacyMode()`
controls, so use the typed provider service when you need either of those
one-request options.

## Next steps

<CardGroup cols={2}>
  <Card title="Provider service guides" icon="layer-group" href="/sdk/php/currency-services">
    Start with typed provider methods before using the Universal Function.
  </Card>

  <Card title="REST API Reference" icon="server" href="/api-reference/overview">
    Verify a released route, its request fields, response, and error contract.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.