> ISPO SDK documentation. [HTML](https://ispo.ai/docs/interfaces/core.EntityApi.html) · [Documentation index](https://ispo.ai/docs/llms.txt)

# Interface EntityApi

```typescript
interface EntityApi {
    content: EntityPrivateContentApi;
    create<T = unknown>(
        type: string,
        data: T,
        options?: EntityCreateOptions,
    ): Promise<EntityRecord<T>>;
    delete<T = unknown>(
        type: string,
        id: string,
        options?: EntityDeleteOptions,
    ): Promise<EntityRecord<T>>;
    get<T = unknown>(type: string, id: string): Promise<EntityRecord<T>>;
    grant(input: EntityGrantInput): Promise<EntityGrant>;
    listTypes(): Promise<EntityTypeDefinition[]>;
    query<T = unknown>(
        type: string,
        query?: EntityQuery,
    ): Promise<EntityQueryResult<T>>;
    requestAccess(
        type: string,
        operations: EntityAccessOperation[],
    ): Promise<EntityAccessRequestResult>;
    revoke(grantId: string): Promise<EntityGrant>;
    subscribe(
        input: EntityWatchInput,
        onChange: EntitySubscriptionChange,
    ): EntitySubscription;
    subscribeQuery<T = unknown>(
        type: string,
        query: EntityQuery,
        onChange: EntityQuerySubscriptionChange<T>,
        options?: { recoveryCursor?: string },
    ): EntityQuerySubscription<T>;
    update<T = unknown>(
        type: string,
        id: string,
        patch: EntityPatch<NoInfer<T>>,
        options?: EntityUpdateOptions,
    ): Promise<EntityRecord<T>>;
    watch(input?: EntityWatchInput): Promise<EntityWatchResult>;
}
```

Types: [content](#content), [EntityPrivateContentApi](core.EntityPrivateContentApi.md), [create](#create-1), [T](#createt), [EntityCreateOptions](core.EntityCreateOptions.md), [EntityRecord](core.EntityRecord.md), [delete](#delete-1), [T](#deletet), [EntityDeleteOptions](core.Supporting_types.EntityDeleteOptions.md), [get](#get-1), [T](#gett), [grant](#grant-1), [EntityGrantInput](core.EntityGrantInput.md), [EntityGrant](core.EntityGrant.md), [listTypes](#listtypes-1), [EntityTypeDefinition](core.EntityTypeDefinition.md), [query](#query-1), [T](#queryt), [EntityQuery](core.EntityQuery.md), [EntityQueryResult](core.EntityQueryResult.md), [requestAccess](#requestaccess-1), [EntityAccessOperation](../types/core.EntityAccessOperation.md), [EntityAccessRequestResult](core.EntityAccessRequestResult.md), [revoke](#revoke-1), [subscribe](#subscribe-1), [EntityWatchInput](core.EntityWatchInput.md), [EntitySubscriptionChange](../types/core.EntitySubscriptionChange.md), [EntitySubscription](core.EntitySubscription.md), [subscribeQuery](#subscribequery-1), [T](#subscribequeryt), [EntityQuerySubscriptionChange](../types/core.EntityQuerySubscriptionChange.md), [EntityQuerySubscription](core.EntityQuerySubscription.md), [update](#update-1), [T](#updatet), [EntityPatch](../types/core.Supporting_types.EntityPatch.md), [EntityUpdateOptions](core.EntityUpdateOptions.md), [watch](#watch-1), [EntityWatchResult](core.EntityWatchResult.md)

##### Index

### <a id="properties"></a>Properties

[content](#content)

### <a id="methods"></a>Methods

[create](#create) [delete](#delete) [get](#get) [grant](#grant) [listTypes](#listtypes) [query](#query) [requestAccess](#requestaccess) [revoke](#revoke) [subscribe](#subscribe) [subscribeQuery](#subscribequery) [update](#update) [watch](#watch)

## <a id="properties-1"></a>Properties

### <a id="content"></a>content

```typescript
content: EntityPrivateContentApi
```

Types: [EntityPrivateContentApi](core.EntityPrivateContentApi.md)

## <a id="methods-1"></a>Methods

### <a id="create"></a>create

*   <a id="create-1"></a>
    
    ```typescript
    create<T = unknown>(
        type: string,
        data: T,
        options?: EntityCreateOptions,
    ): Promise<EntityRecord<T>>
    ```
    
    Types: [T](#createt), [EntityCreateOptions](core.EntityCreateOptions.md), [EntityRecord](core.EntityRecord.md)
    
    #### Type Parameters
    
    *   <a id="createt"></a>T = unknown
    
    #### Parameters
    
    *   type: string
    *   data: [T](#createt)
    *   `Optional`options: [EntityCreateOptions](core.EntityCreateOptions.md)
    
    #### Returns Promise<[EntityRecord](core.EntityRecord.md)<[T](#createt)\>\>
    

### <a id="delete"></a>delete

*   <a id="delete-1"></a>
    
    ```typescript
    delete<T = unknown>(
        type: string,
        id: string,
        options?: EntityDeleteOptions,
    ): Promise<EntityRecord<T>>
    ```
    
    Types: [T](#deletet), [EntityDeleteOptions](core.Supporting_types.EntityDeleteOptions.md), [EntityRecord](core.EntityRecord.md)
    
    #### Type Parameters
    
    *   <a id="deletet"></a>T = unknown
    
    #### Parameters
    
    *   type: string
    *   id: string
    *   `Optional`options: [EntityDeleteOptions](core.Supporting_types.EntityDeleteOptions.md)
    
    #### Returns Promise<[EntityRecord](core.EntityRecord.md)<[T](#deletet)\>\>
    

### <a id="get"></a>get

*   <a id="get-1"></a>
    
    ```typescript
    get<T = unknown>(type: string, id: string): Promise<EntityRecord<T>>
    ```
    
    Types: [T](#gett), [EntityRecord](core.EntityRecord.md)
    
    #### Type Parameters
    
    *   <a id="gett"></a>T = unknown
    
    #### Parameters
    
    *   type: string
    *   id: string
    
    #### Returns Promise<[EntityRecord](core.EntityRecord.md)<[T](#gett)\>\>
    

### <a id="grant"></a>grant

*   <a id="grant-1"></a>
    
    ```typescript
    grant(input: EntityGrantInput): Promise<EntityGrant>
    ```
    
    Types: [EntityGrantInput](core.EntityGrantInput.md), [EntityGrant](core.EntityGrant.md)
    
    #### Parameters
    
    *   input: [EntityGrantInput](core.EntityGrantInput.md)
    
    #### Returns Promise<[EntityGrant](core.EntityGrant.md)\>
    

### <a id="listtypes"></a>listTypes

*   <a id="listtypes-1"></a>
    
    ```typescript
    listTypes(): Promise<EntityTypeDefinition[]>
    ```
    
    Types: [EntityTypeDefinition](core.EntityTypeDefinition.md)
    
    #### Returns Promise<[EntityTypeDefinition](core.EntityTypeDefinition.md)\[\]\>
    

### <a id="query"></a>query

*   <a id="query-1"></a>
    
    ```typescript
    query<T = unknown>(
        type: string,
        query?: EntityQuery,
    ): Promise<EntityQueryResult<T>>
    ```
    
    Types: [T](#queryt), [EntityQuery](core.EntityQuery.md), [EntityQueryResult](core.EntityQueryResult.md)
    
    #### Type Parameters
    
    *   <a id="queryt"></a>T = unknown
    
    #### Parameters
    
    *   type: string
    *   `Optional`query: [EntityQuery](core.EntityQuery.md)
    
    #### Returns Promise<[EntityQueryResult](core.EntityQueryResult.md)<[T](#queryt)\>\>
    

### <a id="requestaccess"></a>requestAccess

*   <a id="requestaccess-1"></a>
    
    ```typescript
    requestAccess(
        type: string,
        operations: EntityAccessOperation[],
    ): Promise<EntityAccessRequestResult>
    ```
    
    Types: [EntityAccessOperation](../types/core.EntityAccessOperation.md), [EntityAccessRequestResult](core.EntityAccessRequestResult.md)
    
    Ask the user to grant this app access to an entity type for which it lacks the requested live authority. Read/query/watch may target one type or `'*'`; additive `create` may target one exact type only. Wildcard create and update/delete/grant are rejected. The host files and holds a durable approval card; an Allow resolves only after the exact host writer acknowledges and live authority rechecks. A caller deadline returns `pending` while the durable ask remains open, a lapsed ask returns `expired`, a trust/declaration veto returns `blocked`, and a post-Allow host write failure returns `decision: 'error'` with `reason: 'apply-failed'` — never `deny`, which only ever means a human refused.
    
    #### Parameters
    
    *   type: string
    *   operations: [EntityAccessOperation](../types/core.EntityAccessOperation.md)\[\]
    
    #### Returns Promise<[EntityAccessRequestResult](core.EntityAccessRequestResult.md)\>
    

### <a id="revoke"></a>revoke

*   <a id="revoke-1"></a>
    
    ```typescript
    revoke(grantId: string): Promise<EntityGrant>
    ```
    
    Types: [EntityGrant](core.EntityGrant.md)
    
    #### Parameters
    
    *   grantId: string
    
    #### Returns Promise<[EntityGrant](core.EntityGrant.md)\>
    

### <a id="subscribe"></a>subscribe

*   <a id="subscribe-1"></a>
    
    ```typescript
    subscribe(
        input: EntityWatchInput,
        onChange: EntitySubscriptionChange,
    ): EntitySubscription
    ```
    
    Types: [EntityWatchInput](core.EntityWatchInput.md), [EntitySubscriptionChange](../types/core.EntitySubscriptionChange.md), [EntitySubscription](core.EntitySubscription.md)
    
    Host-pushed live form of `watch` (§16.5). Opens a stream; `onChange` is called with each fresh batch (de-duped exactly-once). Returns a handle whose `close()` ends the stream. `watch` remains the long-poll fallback.
    
    #### Parameters
    
    *   input: [EntityWatchInput](core.EntityWatchInput.md)
    *   onChange: [EntitySubscriptionChange](../types/core.EntitySubscriptionChange.md)
    
    #### Returns [EntitySubscription](core.EntitySubscription.md)
    

### <a id="subscribequery"></a>subscribeQuery

*   <a id="subscribequery-1"></a>
    
    ```typescript
    subscribeQuery<T = unknown>(
        type: string,
        query: EntityQuery,
        onChange: EntityQuerySubscriptionChange<T>,
        options?: { recoveryCursor?: string },
    ): EntityQuerySubscription<T>
    ```
    
    Types: [T](#subscribequeryt), [EntityQuery](core.EntityQuery.md), [EntityQuerySubscriptionChange](../types/core.EntityQuerySubscriptionChange.md), [EntityQuerySubscription](core.EntityQuerySubscription.md)
    
    Query membership stream. It is intentionally distinct from `subscribe()`: the host validates the query and sends an authorized seed followed by enter/update/leave deltas.
    
    #### Type Parameters
    
    *   <a id="subscribequeryt"></a>T = unknown
    
    #### Parameters
    
    *   type: string
    *   query: [EntityQuery](core.EntityQuery.md)
    *   onChange: [EntityQuerySubscriptionChange](../types/core.EntityQuerySubscriptionChange.md)<[T](#subscribequeryt)\>
    *   `Optional`options: { recoveryCursor?: string }
    
    #### Returns [EntityQuerySubscription](core.EntityQuerySubscription.md)<[T](#subscribequeryt)\>
    

### <a id="update"></a>update

*   <a id="update-1"></a>
    
    ```typescript
    update<T = unknown>(
        type: string,
        id: string,
        patch: EntityPatch<NoInfer<T>>,
        options?: EntityUpdateOptions,
    ): Promise<EntityRecord<T>>
    ```
    
    Types: [T](#updatet), [EntityPatch](../types/core.Supporting_types.EntityPatch.md), [EntityUpdateOptions](core.EntityUpdateOptions.md), [EntityRecord](core.EntityRecord.md)
    
    #### Type Parameters
    
    *   <a id="updatet"></a>T = unknown
    
    #### Parameters
    
    *   type: string
    *   id: string
    *   patch: [EntityPatch](../types/core.Supporting_types.EntityPatch.md)<NoInfer<[T](#updatet)\>\>
    *   `Optional`options: [EntityUpdateOptions](core.EntityUpdateOptions.md)
    
    #### Returns Promise<[EntityRecord](core.EntityRecord.md)<[T](#updatet)\>\>
    

### <a id="watch"></a>watch

*   <a id="watch-1"></a>
    
    ```typescript
    watch(input?: EntityWatchInput): Promise<EntityWatchResult>
    ```
    
    Types: [EntityWatchInput](core.EntityWatchInput.md), [EntityWatchResult](core.EntityWatchResult.md)
    
    #### Parameters
    
    *   `Optional`input: [EntityWatchInput](core.EntityWatchInput.md)
    
    #### Returns Promise<[EntityWatchResult](core.EntityWatchResult.md)\>
