diff --git a/packages/loot-core/src/server/api-models.ts b/packages/loot-core/src/server/api-models.ts
index f3d146067df74a7f154147f74857447cd784f679..69be7a40a23456cd743193eb863121545538c8c4 100644
--- a/packages/loot-core/src/server/api-models.ts
+++ b/packages/loot-core/src/server/api-models.ts
@@ -1,10 +1,21 @@
-// @ts-strict-ignore
+import type {
+  AccountEntity,
+  CategoryEntity,
+  CategoryGroupEntity,
+  PayeeEntity,
+} from '../types/models';
+
 import * as models from './models';
 
+export type APIAccountEntity = Pick<AccountEntity, 'id' | 'name'> & {
+  offbudget: boolean;
+  closed: boolean;
+};
+
 export const accountModel = {
   ...models.accountModel,
 
-  toExternal(account) {
+  toExternal(account: AccountEntity): APIAccountEntity {
     return {
       id: account.id,
       name: account.name,
@@ -13,8 +24,8 @@ export const accountModel = {
     };
   },
 
-  fromExternal(account) {
-    const result = { ...account };
+  fromExternal(account: APIAccountEntity) {
+    const result = { ...account } as unknown as AccountEntity;
     if ('offbudget' in account) {
       result.offbudget = account.offbudget ? 1 : 0;
     }
@@ -25,10 +36,17 @@ export const accountModel = {
   },
 };
 
+export type APICategoryEntity = Pick<
+  CategoryEntity,
+  'id' | 'name' | 'is_income' | 'hidden'
+> & {
+  group_id?: string;
+};
+
 export const categoryModel = {
   ...models.categoryModel,
 
-  toExternal(category) {
+  toExternal(category: CategoryEntity): APICategoryEntity {
     return {
       id: category.id,
       name: category.name,
@@ -38,14 +56,10 @@ export const categoryModel = {
     };
   },
 
-  fromExternal(category) {
-    const { group_id: _, ...result } = category;
-    if ('is_income' in category) {
-      result.is_income = category.is_income ? 1 : 0;
-    }
-    if ('hidden' in category) {
-      result.hidden = category.hidden ? 1 : 0;
-    }
+  fromExternal(category: APICategoryEntity) {
+    const { group_id: _, ...result }: { group_id?: string } & CategoryEntity =
+      category;
+
     if ('group_id' in category) {
       result.cat_group = category.group_id;
     }
@@ -53,27 +67,28 @@ export const categoryModel = {
   },
 };
 
+export type APICategoryGroupEntity = Pick<
+  CategoryGroupEntity,
+  'id' | 'name' | 'is_income' | 'hidden'
+> & {
+  categories: APICategoryEntity[];
+};
+
 export const categoryGroupModel = {
   ...models.categoryGroupModel,
 
-  toExternal(group) {
+  toExternal(group: CategoryGroupEntity): APICategoryGroupEntity {
     return {
       id: group.id,
       name: group.name,
       is_income: group.is_income ? true : false,
       hidden: group.hidden ? true : false,
-      categories: group.categories.map(categoryModel.toExternal),
+      categories: group.categories?.map(categoryModel.toExternal) || [],
     };
   },
 
-  fromExternal(group) {
-    const result = { ...group };
-    if ('is_income' in group) {
-      result.is_income = group.is_income ? 1 : 0;
-    }
-    if ('hidden' in group) {
-      result.hidden = group.hidden ? 1 : 0;
-    }
+  fromExternal(group: APICategoryGroupEntity) {
+    const result = { ...group } as unknown as CategoryGroupEntity;
     if ('categories' in group) {
       result.categories = group.categories.map(categoryModel.fromExternal);
     }
@@ -81,20 +96,21 @@ export const categoryGroupModel = {
   },
 };
 
+export type APIPayeeEntity = Pick<PayeeEntity, 'id' | 'name' | 'transfer_acct'>;
+
 export const payeeModel = {
   ...models.payeeModel,
 
-  toExternal(payee) {
+  toExternal(payee: PayeeEntity) {
     return {
       id: payee.id,
       name: payee.name,
-      category: payee.category,
       transfer_acct: payee.transfer_acct,
     };
   },
 
-  fromExternal(payee) {
+  fromExternal(payee: APIPayeeEntity) {
     // No translation is needed
-    return payee;
+    return payee as PayeeEntity;
   },
 };
diff --git a/packages/loot-core/src/types/api-handlers.d.ts b/packages/loot-core/src/types/api-handlers.d.ts
index c1f42776f37e807158d26cbc9bdde6c372673dfe..5fc820e4a2289dc07f40a096cf277d930e8b8ed3 100644
--- a/packages/loot-core/src/types/api-handlers.d.ts
+++ b/packages/loot-core/src/types/api-handlers.d.ts
@@ -1,12 +1,12 @@
 import { type batchUpdateTransactions } from '../server/accounts/transactions';
-
 import type {
-  TransactionEntity,
-  AccountEntity,
-  CategoryGroupEntity,
-  CategoryEntity,
-  PayeeEntity,
-} from './models';
+  APICategoryEntity,
+  APIAccountEntity,
+  APICategoryGroupEntity,
+  APIPayeeEntity,
+} from '../server/api-models';
+
+import type { TransactionEntity } from './models';
 import { type ServerHandlers } from './server-handlers';
 
 export interface ApiHandlers {
@@ -96,7 +96,7 @@ export interface ApiHandlers {
 
   'api/sync': () => Promise<void>;
 
-  'api/accounts-get': () => Promise<AccountEntity[]>;
+  'api/accounts-get': () => Promise<APIAccountEntity[]>;
 
   'api/account-create': (arg: { account; initialBalance? }) => Promise<string>;
 
@@ -114,9 +114,9 @@ export interface ApiHandlers {
 
   'api/categories-get': (arg: {
     grouped;
-  }) => Promise<Array<CategoryGroupEntity | CategoryEntity>>;
+  }) => Promise<Array<APICategoryGroupEntity | APICategoryEntity>>;
 
-  'api/category-groups-get': () => Promise<CategoryGroupEntity[]>;
+  'api/category-groups-get': () => Promise<APICategoryGroupEntity[]>;
 
   'api/category-group-create': (arg: { group }) => Promise<string>;
 
@@ -136,7 +136,7 @@ export interface ApiHandlers {
     transferCategoryId?;
   }) => Promise<{ error?: string }>;
 
-  'api/payees-get': () => Promise<PayeeEntity[]>;
+  'api/payees-get': () => Promise<APIPayeeEntity[]>;
 
   'api/payee-create': (arg: { payee }) => Promise<string>;
 
diff --git a/upcoming-release-notes/2716.md b/upcoming-release-notes/2716.md
new file mode 100644
index 0000000000000000000000000000000000000000..ab223026e86c64c8c0f4465bdb9c884b0e3b8665
--- /dev/null
+++ b/upcoming-release-notes/2716.md
@@ -0,0 +1,6 @@
+---
+category: Maintenance
+authors: [twk3]
+---
+
+Create types for the external versions of entities meant for the API`