> This page is for Applications Protection.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.humansecurity.com/llms.txt.

# Integration with gRPC

#### v3.0

The SDK can be integrated into [gRPC](https://grpc.io/) projects.

## Start the SDK

The automatic interceptor is not supported in gRPC, so you should disable requests interception by setting the `PXPolicy/urlRequestInterceptionType` to `PXPolicyUrlRequestInterceptionType/none`.

```swift
policy.urlRequestInterceptionType = .none
```

```objectivec
policy.urlRequestInterceptionType = PXPolicyUrlRequestInterceptionTypeNone
```

> **Read about manual integration**
>
> You should read how to work with [**manual integration**](/applications/ios-manual-integration-v3) in your app.

## Adding SDK's HTTP headers to your gRPC requests

In order to include the SDK's HTTP headers in your gRPC requests, you should add them to your request's metadata.

```swift
let headers = PerimeterX.headersForURLRequest()!
var callOption = CallOptions()
for (key, value) in headers {
	callOption.customMetadata.replaceOrAdd(name: key, value: value)
}
// send you gRPC request with `callOption`...
```

Now, use the `call option` instance when you call your send your gRPC request.

## Handle block responses from your server

After receiving an error in the server's response, the gRPC library will throw an exception. pass the information to SDK with the `PerimeterX/handleResponse(response:data:forAppId:callback:)` function.

```swift
do {
	// send your gRPC request...
} catch {
	if let statusError = error as? GRPC.GRPCStatus, let data = statusError.message?.data(using: .utf8) {
		let response = HTTPURLResponse(url: URL(string: "https://your.server.domain")!, statusCode: 403, httpVersion: nil, headerFields: nil)!
		PerimeterX.handleResponse(response: response, data: data) { result in
			print("challenge result = \(result)")
		}
	}
}
```