# Resultado & erros
CheckoutResult, PaymentResult e FaciPayError.
O checkout devolve um `CheckoutResult`.
```swift
enum CheckoutResult {
case approved(PaymentResult) // pagamento confirmado
case pending(PaymentResult) // referência gerada
case cancelled // utilizador cancelou
case failed(FaciPayError) // erro
}
```
```swift
completion: { result in
switch result {
case .approved(let payment):
updateUI(status: "Confirmado", orderId: payment.orderId)
case .pending(let payment):
showReference(payment.rawData)
case .cancelled:
updateUI(status: "Cancelado")
case .failed(let error):
showError(error.localizedDescription)
}
}
```
## PaymentResult
Identificador da ordem FaciPay.
`.created` | `.pending` | `.cancelled` | `.confirmed`.
`.direct` | `.mcx` | `.reference`.
Campos adicionais da resposta (referência, entidade, etc.).
## FaciPayError
```swift
.invalidKey(String) .paymentFailed(String)
.keyValidationFailed(String) .cancelled
.networkError(String) .invalidRequest(String)
.sdkNotInitialized .uiError(String)
.timeout .unknown(String)
```
Todos os erros expõem `errorDescription` e `recoverySuggestion` (via `LocalizedError`).
Como na web, o **webhook no seu backend** é a fonte da verdade. Confirme o pagamento pelo
webhook antes do fulfillment. Ver [Webhooks](/pt/api-reference/webhooks).