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

# fetchPermission

> Retrieve a single Spend Permission by its hash

export const Button = ({children, disabled, variant = "primary", size = "medium", iconName, roundedFull = false, className = '', fullWidth = false, onClick = undefined}) => {
  const variantStyles = {
    primary: 'bg-blue text-black border border-blue hover:bg-blue-80 active:bg-[#06318E] dark:text-white',
    secondary: 'bg-white border border-white text-palette-foreground hover:bg-zinc-15 active:bg-zinc-30',
    outlined: 'bg-transparent text-white border border-white hover:bg-white hover:text-black active:bg-[#E3E7E9]'
  };
  const sizeStyles = {
    medium: 'text-md px-4 py-2 gap-3',
    large: 'text-lg px-6 py-4 gap-5'
  };
  const sizeIconRatio = {
    medium: '0.75rem',
    large: '1rem'
  };
  const classes = ['text-md px-4 py-2 whitespace-nowrap', 'flex items-center justify-center', 'disabled:opacity-40 disabled:pointer-events-none', 'transition-all', variantStyles[variant], sizeStyles[size], roundedFull ? 'rounded-full' : 'rounded-lg', fullWidth ? 'w-full' : 'w-auto', className];
  const buttonClasses = classes.filter(Boolean).join(' ');
  const iconSize = sizeIconRatio[size];
  return <button type="button" disabled={disabled} className={buttonClasses} onClick={onClick}>
      <span>{children}</span>
      {iconName && <Icon name={iconName} width={iconSize} height={iconSize} color="currentColor" />}
    </button>;
};

export const BaseBanner = ({content = null, id, dismissable = true}) => {
  const LOCAL_STORAGE_KEY_PREFIX = 'cb-docs-banner';
  const [isVisible, setIsVisible] = useState(false);
  const onDismiss = () => {
    localStorage.setItem(`${LOCAL_STORAGE_KEY_PREFIX}-${id}`, 'false');
    setIsVisible(false);
  };
  useEffect(() => {
    const storedValue = localStorage.getItem(`${LOCAL_STORAGE_KEY_PREFIX}-${id}`);
    setIsVisible(storedValue !== 'false');
  }, []);
  if (!isVisible) {
    return null;
  }
  return <div className="fixed bottom-0 left-0 right-0 bg-white py-8 px-4 lg:px-12 z-50 text-black dark:bg-black dark:text-white border-t dark:border-gray-95">
      <div className="flex items-center max-w-8xl mx-auto">
        {typeof content === 'function' ? content({
    onDismiss
  }) : content}
        {dismissable && <button onClick={onDismiss} className="flex-shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors" aria-label="Dismiss banner">
          ✕
        </button>}
      </div>
    </div>;
};

Defined in the [Base Account SDK](https://github.com/base/account-sdk)

<Info>
  Returns a single spend permission by its unique hash identifier. This is useful when you have a permission hash from a previous operation and need to retrieve its current details.
</Info>

## Parameters

<ParamField body="permissionHash" type="string" required>
  The unique hash identifier of the permission to retrieve.
</ParamField>

<ParamField body="provider" type="EIP1193Provider">
  Optional. EIP-1193 compliant Ethereum provider instance. Get this from `sdk.getProvider()`. If not provided, uses the default SDK provider.
</ParamField>

## Returns

<ResponseField name="permission" type="SpendPermission | null">
  The spend permission matching the hash, or null if not found.

  <Expandable title="SpendPermission properties">
    <ResponseField name="permissionHash" type="string">
      Deterministic EIP-712 hash of the permission.
    </ResponseField>

    <ResponseField name="signature" type="string">
      Signature for the EIP-712 payload.
    </ResponseField>

    <ResponseField name="chainId" type="number">
      Target chain ID.
    </ResponseField>

    <ResponseField name="permission" type="object">
      Underlying permission fields.

      <Expandable title="permission fields">
        <ResponseField name="account" type="address" />

        <ResponseField name="spender" type="address" />

        <ResponseField name="token" type="address" />

        <ResponseField name="allowance" type="bigint" />

        <ResponseField name="period" type="number">Duration in seconds.</ResponseField>
        <ResponseField name="start" type="number">Unix timestamp (seconds).</ResponseField>
        <ResponseField name="end" type="number">Unix timestamp (seconds).</ResponseField>

        <ResponseField name="salt" type="string" />

        <ResponseField name="extraData" type="string" />
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```typescript Fetch single permission theme={null}
  import { fetchPermission } from "@base-org/account/spend-permission";
  import { createBaseAccountSDK } from "@base-org/account";

  const sdk = createBaseAccountSDK({
    appName: 'My App',
    appLogoUrl: 'https://example.com/logo.png',
    appChainIds: [84532],
  });

  // Fetch a specific permission by its hash
  const permission = await fetchPermission({
    permissionHash: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
    provider: sdk.getProvider(),
  });

  if (permission) {
    console.log('Permission found:', permission);
  } else {
    console.log('Permission not found');
  }

  // Using without explicit provider (uses default SDK provider)
  const permission2 = await fetchPermission({
    permissionHash: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
  });
  ```
</RequestExample>

## Error Handling

The function returns `null` if the permission is not found rather than throwing an error. Always check for null values:

```typescript theme={null}
const permission = await fetchPermission({
  permissionHash: hash,
});

if (!permission) {
  // Handle permission not found
  console.error('Permission not found');
  return;
}

// Safe to use permission here
console.log('Permission details:', permission);
```

## Usage Notes

<Note>
  This function is particularly useful when:

  * You have a permission hash from a previous operation (e.g., from `requestSpendPermission`)
  * You want to verify the current state of a specific permission
  * You need to look up permission details without knowing the account or spender information
  * You're tracking specific permissions across sessions
</Note>

Unlike `fetchPermissions`, this function:

* Returns a single permission instead of an array
* Does not require account, chain, or spender parameters
* Provides direct access via the permission's unique identifier
* Returns `null` instead of an empty array when no permission is found

<BaseBanner
  id="privacy-policy"
  dismissable={false}
  content={({ onDismiss }) => (
<div className="flex items-center">
  <div className="mr-2">
    We're updating the Base Privacy Policy, effective July 25, 2025, to reflect an expansion of Base services. Please review the updated policy here:{" "}
    <a
      href="https://docs.base.org/privacy-policy-2025"
      target="_blank"
      className="whitespace-nowrap"
    >
      Base Privacy Policy
    </a>. By continuing to use Base services, you confirm that you have read and understand the updated policy.
  </div>
  <Button onClick={onDismiss}>I Acknowledge</Button>
</div>
)}
/>
