curl -X DELETE "https://api.contazen.ro/v1/expense-categories/25" \
-H "Authorization: Bearer YOUR_API_KEY"
const categoryId = 25;
const response = await fetch(`https://api.contazen.ro/v1/expense-categories/${categoryId}`, {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
const data = await response.json();
if (data.success) {
console.log('Category deleted:', data.message);
} else {
console.error('Delete failed:', data.error.message);
}
const categoryId = 25;
// First, check if category can be deleted
const checkResponse = await fetch(`https://api.contazen.ro/v1/expense-categories/${categoryId}`, {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
const categoryData = await checkResponse.json();
if (categoryData.category.type === 'system') {
console.error('Cannot delete system category');
return;
}
// Proceed with deletion
const deleteResponse = await fetch(`https://api.contazen.ro/v1/expense-categories/${categoryId}`, {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
const result = await deleteResponse.json();
console.log('Delete result:', result);
$categoryId = 25;
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contazen.ro/v1/expense-categories/{$categoryId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$data = json_decode($response, true);
curl_close($curl);
if ($data['success']) {
echo 'Category deleted: ' . $data['message'];
} else {
echo 'Delete failed: ' . $data['error']['message'];
}
$categoryId = 25;
// First check the category type
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contazen.ro/v1/expense-categories/{$categoryId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$categoryData = json_decode($response, true);
if ($categoryData['category']['type'] === 'system') {
echo 'Error: Cannot delete system category';
exit;
}
// Proceed with deletion
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contazen.ro/v1/expense-categories/{$categoryId}",
CURLOPT_CUSTOMREQUEST => 'DELETE'
]);
$deleteResponse = curl_exec($curl);
$deleteData = json_decode($deleteResponse, true);
curl_close($curl);
if ($deleteData['success']) {
echo 'Successfully deleted category ID: ' . $deleteData['id'];
} else {
echo 'Delete failed: ' . $deleteData['error']['message'];
if (isset($deleteData['error']['expense_count'])) {
echo ' (Has ' . $deleteData['error']['expense_count'] . ' expenses)';
}
}
{
"success": true,
"message": "Category deleted successfully",
"id": 25
}
{
"success": false,
"error": {
"message": "Category ID is required",
"type": "invalid_request_error",
"code": "parameter_missing",
"param": "id"
}
}
{
"success": false,
"error": {
"message": "Category not found",
"type": "invalid_request_error",
"code": "resource_missing",
"param": "id"
}
}
{
"success": false,
"error": {
"message": "Cannot delete system category",
"type": "invalid_request_error",
"code": "system_category"
}
}
{
"success": false,
"error": {
"message": "Category has expenses assigned and cannot be deleted",
"type": "invalid_request_error",
"code": "category_in_use",
"expense_count": 15
}
}
{
"success": false,
"error": {
"message": "Category has subcategories and cannot be deleted",
"type": "invalid_request_error",
"code": "category_has_children",
"subcategory_count": 3
}
}
{
"success": false,
"error": {
"message": "You don't have permission to delete categories",
"type": "invalid_request_error",
"code": "permission_denied"
}
}
{
"success": false,
"error": {
"message": "Failed to delete category",
"type": "api_error",
"code": "delete_failed"
}
}
Expense Categories
Delete Expense Category
Delete a custom expense category from your firm
DELETE
/
expense-categories
/
{id}
curl -X DELETE "https://api.contazen.ro/v1/expense-categories/25" \
-H "Authorization: Bearer YOUR_API_KEY"
const categoryId = 25;
const response = await fetch(`https://api.contazen.ro/v1/expense-categories/${categoryId}`, {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
const data = await response.json();
if (data.success) {
console.log('Category deleted:', data.message);
} else {
console.error('Delete failed:', data.error.message);
}
const categoryId = 25;
// First, check if category can be deleted
const checkResponse = await fetch(`https://api.contazen.ro/v1/expense-categories/${categoryId}`, {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
const categoryData = await checkResponse.json();
if (categoryData.category.type === 'system') {
console.error('Cannot delete system category');
return;
}
// Proceed with deletion
const deleteResponse = await fetch(`https://api.contazen.ro/v1/expense-categories/${categoryId}`, {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
const result = await deleteResponse.json();
console.log('Delete result:', result);
$categoryId = 25;
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contazen.ro/v1/expense-categories/{$categoryId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$data = json_decode($response, true);
curl_close($curl);
if ($data['success']) {
echo 'Category deleted: ' . $data['message'];
} else {
echo 'Delete failed: ' . $data['error']['message'];
}
$categoryId = 25;
// First check the category type
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contazen.ro/v1/expense-categories/{$categoryId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$categoryData = json_decode($response, true);
if ($categoryData['category']['type'] === 'system') {
echo 'Error: Cannot delete system category';
exit;
}
// Proceed with deletion
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contazen.ro/v1/expense-categories/{$categoryId}",
CURLOPT_CUSTOMREQUEST => 'DELETE'
]);
$deleteResponse = curl_exec($curl);
$deleteData = json_decode($deleteResponse, true);
curl_close($curl);
if ($deleteData['success']) {
echo 'Successfully deleted category ID: ' . $deleteData['id'];
} else {
echo 'Delete failed: ' . $deleteData['error']['message'];
if (isset($deleteData['error']['expense_count'])) {
echo ' (Has ' . $deleteData['error']['expense_count'] . ' expenses)';
}
}
{
"success": true,
"message": "Category deleted successfully",
"id": 25
}
{
"success": false,
"error": {
"message": "Category ID is required",
"type": "invalid_request_error",
"code": "parameter_missing",
"param": "id"
}
}
{
"success": false,
"error": {
"message": "Category not found",
"type": "invalid_request_error",
"code": "resource_missing",
"param": "id"
}
}
{
"success": false,
"error": {
"message": "Cannot delete system category",
"type": "invalid_request_error",
"code": "system_category"
}
}
{
"success": false,
"error": {
"message": "Category has expenses assigned and cannot be deleted",
"type": "invalid_request_error",
"code": "category_in_use",
"expense_count": 15
}
}
{
"success": false,
"error": {
"message": "Category has subcategories and cannot be deleted",
"type": "invalid_request_error",
"code": "category_has_children",
"subcategory_count": 3
}
}
{
"success": false,
"error": {
"message": "You don't have permission to delete categories",
"type": "invalid_request_error",
"code": "permission_denied"
}
}
{
"success": false,
"error": {
"message": "Failed to delete category",
"type": "api_error",
"code": "delete_failed"
}
}
Overview
The Delete Expense Category endpoint allows you to permanently remove custom expense categories that are no longer needed. This operation has strict safety checks to prevent data loss. Important Restrictions:- You can only delete custom categories that you created
- System default categories cannot be deleted
- Categories must have no expenses assigned to them
- Categories must have no subcategories under them
- Categories must belong to your firm
Path Parameters
integer
required
The unique identifier of the expense category to delete
Safety Checks
Before deleting a category, the system performs several validation checks:- System Protection: Cannot delete system/default categories
- Usage Check: Cannot delete categories that have expenses assigned
- Hierarchy Check: Cannot delete categories that have subcategories
- Ownership: Can only delete categories belonging to your firm
Response
string
Success message confirming the category deletion
integer
The ID of the deleted category
Pre-Deletion Checklist
Before attempting to delete a category:- Move or delete all expenses using this category
- Delete or reassign all subcategories under this category
- Confirm it’s a custom category (not a system default)
curl -X DELETE "https://api.contazen.ro/v1/expense-categories/25" \
-H "Authorization: Bearer YOUR_API_KEY"
const categoryId = 25;
const response = await fetch(`https://api.contazen.ro/v1/expense-categories/${categoryId}`, {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
const data = await response.json();
if (data.success) {
console.log('Category deleted:', data.message);
} else {
console.error('Delete failed:', data.error.message);
}
const categoryId = 25;
// First, check if category can be deleted
const checkResponse = await fetch(`https://api.contazen.ro/v1/expense-categories/${categoryId}`, {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
const categoryData = await checkResponse.json();
if (categoryData.category.type === 'system') {
console.error('Cannot delete system category');
return;
}
// Proceed with deletion
const deleteResponse = await fetch(`https://api.contazen.ro/v1/expense-categories/${categoryId}`, {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
});
const result = await deleteResponse.json();
console.log('Delete result:', result);
$categoryId = 25;
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contazen.ro/v1/expense-categories/{$categoryId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$data = json_decode($response, true);
curl_close($curl);
if ($data['success']) {
echo 'Category deleted: ' . $data['message'];
} else {
echo 'Delete failed: ' . $data['error']['message'];
}
$categoryId = 25;
// First check the category type
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contazen.ro/v1/expense-categories/{$categoryId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
]
]);
$response = curl_exec($curl);
$categoryData = json_decode($response, true);
if ($categoryData['category']['type'] === 'system') {
echo 'Error: Cannot delete system category';
exit;
}
// Proceed with deletion
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contazen.ro/v1/expense-categories/{$categoryId}",
CURLOPT_CUSTOMREQUEST => 'DELETE'
]);
$deleteResponse = curl_exec($curl);
$deleteData = json_decode($deleteResponse, true);
curl_close($curl);
if ($deleteData['success']) {
echo 'Successfully deleted category ID: ' . $deleteData['id'];
} else {
echo 'Delete failed: ' . $deleteData['error']['message'];
if (isset($deleteData['error']['expense_count'])) {
echo ' (Has ' . $deleteData['error']['expense_count'] . ' expenses)';
}
}
{
"success": true,
"message": "Category deleted successfully",
"id": 25
}
{
"success": false,
"error": {
"message": "Category ID is required",
"type": "invalid_request_error",
"code": "parameter_missing",
"param": "id"
}
}
{
"success": false,
"error": {
"message": "Category not found",
"type": "invalid_request_error",
"code": "resource_missing",
"param": "id"
}
}
{
"success": false,
"error": {
"message": "Cannot delete system category",
"type": "invalid_request_error",
"code": "system_category"
}
}
{
"success": false,
"error": {
"message": "Category has expenses assigned and cannot be deleted",
"type": "invalid_request_error",
"code": "category_in_use",
"expense_count": 15
}
}
{
"success": false,
"error": {
"message": "Category has subcategories and cannot be deleted",
"type": "invalid_request_error",
"code": "category_has_children",
"subcategory_count": 3
}
}
{
"success": false,
"error": {
"message": "You don't have permission to delete categories",
"type": "invalid_request_error",
"code": "permission_denied"
}
}
{
"success": false,
"error": {
"message": "Failed to delete category",
"type": "api_error",
"code": "delete_failed"
}
}
Best Practices
Before Deleting Categories
- Check Dependencies: Use the List Expenses API to find expenses using this category
- Reassign Expenses: Move expenses to different categories before deletion
- Handle Subcategories: Delete or reassign all subcategories first
- Backup Important Data: Export expense data if the category contains historical records
Alternative to Deletion
Instead of deleting categories, consider:- Hide Categories: Set
is_visible: falseto hide unused categories - Rename Categories: Update the name for repurposing
- Archive Approach: Keep historical categories for reporting consistency
Was this page helpful?
⌘I