Skip to main content

API Integration

ABC User Feedback can integrate with external systems through RESTful API. You can programmatically collect feedback, manage issues, and query data, making it easy to integrate with existing services or workflows.


API Basic Information​

Official API Documentation​

The complete API documentation for ABC User Feedback can be found at the following link:

🔗 Official API Documentation (Redocly)

This documentation provides detailed specs for all endpoints, request/response examples, and an interface for actual testing.

Base URL​

https://your-domain.com/api

Authentication Method​

All API requests use API key-based authentication.

X-API-KEY: your-api-key-here
Content-Type: application/json
Security Notice

Use API keys only on the server side, and do not expose them to clients (browsers, mobile apps).

API Key Issuance Method​

  1. Access Admin Page: Log in to ABC User Feedback admin page
  2. Project Settings: Navigate to the settings page for the project
  3. API Key Management: Create a new API key from the "API Key Management" menu
  4. Copy Key: Save the generated API key in a safe place
API Key Permissions

API keys are issued per project and can only access data for that project.


Main API Endpoint Examples​

1. Creating Feedback​

Basic Feedback Creation​

const createFeedback = async (
projectId,
channelId,
message,
issueNames = []
) => {
const response = await fetch(
`/api/projects/${projectId}/channels/${channelId}/feedbacks`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "your-api-key-here",
},
body: JSON.stringify({
message: message,
issueNames: issueNames,
}),
}
);

return await response.json();
};

// Usage example
const feedback = await createFeedback(1, 1, "Payment error occurred", [
"Payment",
"Error",
]);

2. Querying Feedback​

const searchFeedbacks = async (
projectId,
channelId,
searchText,
limit = 10,
page = 1
) => {
const response = await fetch(
`/api/projects/${projectId}/channels/${channelId}/feedbacks/search`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "your-api-key-here",
},
body: JSON.stringify({
limit: limit,
page: page,
query: {
searchText: searchText,
createdAt: {
gte: "2024-01-01",
lt: "2024-12-31",
},
},
sort: {
createdAt: "DESC",
},
}),
}
);

return await response.json();
};

// Usage example
const feedbacks = await searchFeedbacks(1, 1, "Payment", 20, 1);
console.log(
`Retrieved ${feedbacks.items.length} out of ${feedbacks.meta.totalItems} feedback`
);

Single Feedback Query​

const getFeedbackById = async (projectId, channelId, feedbackId) => {
const response = await fetch(
`/api/projects/${projectId}/channels/${channelId}/feedbacks/${feedbackId}`,
{
method: "GET",
headers: {
"X-API-KEY": "your-api-key-here",
},
}
);

return await response.json();
};

// Usage example
const feedback = await getFeedbackById(1, 1, 123);
console.log("Feedback details:", feedback);

Feedback Update​

const updateFeedback = async (projectId, channelId, feedbackId, updateData) => {
const response = await fetch(
`/api/projects/${projectId}/channels/${channelId}/feedbacks/${feedbackId}`,
{
method: "PUT",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "your-api-key-here",
},
body: JSON.stringify(updateData),
}
);

return await response.json();
};

// Usage example
const updatedFeedback = await updateFeedback(1, 1, 123, {
message: "Updated feedback content",
issueNames: ["Updated issue"],
});

Feedback Deletion​

const deleteFeedbacks = async (projectId, channelId, feedbackIds) => {
const response = await fetch(
`/api/projects/${projectId}/channels/${channelId}/feedbacks`,
{
method: "DELETE",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "your-api-key-here",
},
body: JSON.stringify({
feedbackIds: feedbackIds,
}),
}
);

return await response.json();
};

// Usage example
const result = await deleteFeedbacks(1, 1, [123, 124, 125]);
console.log("Deletion complete:", result);

3. Issue Management​

Issue Creation​

const createIssue = async (projectId, name, description) => {
const response = await fetch(`/api/projects/${projectId}/issues`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "your-api-key-here",
},
body: JSON.stringify({
name: name,
description: description,
}),
});

return await response.json();
};

// Usage example
const issue = await createIssue(
1,
"Payment Error",
"User experienced error during payment process"
);
const searchIssues = async (projectId, query = {}) => {
const response = await fetch(`/api/projects/${projectId}/issues/search`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "your-api-key-here",
},
body: JSON.stringify({
limit: 10,
page: 1,
query: query,
sort: {
createdAt: "DESC",
},
}),
});

return await response.json();
};

// Usage example
const issues = await searchIssues(1, { name: "Payment" });

Issue Query​

const getIssueById = async (projectId, issueId) => {
const response = await fetch(`/api/projects/${projectId}/issues/${issueId}`, {
method: "GET",
headers: {
"X-API-KEY": "your-api-key-here",
},
});

return await response.json();
};

// Usage example
const issue = await getIssueById(1, 123);
console.log("Issue details:", issue);

Issue Update​

const updateIssue = async (projectId, issueId, updateData) => {
const response = await fetch(`/api/projects/${projectId}/issues/${issueId}`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "your-api-key-here",
},
body: JSON.stringify(updateData),
});

return await response.json();
};

// Usage example
const updatedIssue = await updateIssue(1, 123, {
name: "Updated issue name",
description: "Updated issue description",
});

Issue Deletion​

const deleteIssues = async (projectId, issueIds) => {
const response = await fetch(`/api/projects/${projectId}/issues`, {
method: "DELETE",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "your-api-key-here",
},
body: JSON.stringify({
issueIds: issueIds,
}),
});

return await response.json();
};

// Usage example
const result = await deleteIssues(1, [123, 124, 125]);
console.log("Issue deletion complete:", result);

Adding Issue to Feedback​

const addIssueToFeedback = async (
projectId,
channelId,
feedbackId,
issueId
) => {
const response = await fetch(
`/api/projects/${projectId}/channels/${channelId}/feedbacks/${feedbackId}/issues/${issueId}`,
{
method: "POST",
headers: {
"X-API-KEY": "your-api-key-here",
},
}
);

return await response.json();
};

// Usage example
const result = await addIssueToFeedback(1, 1, 123, 456);
console.log("Issue added:", result);

Removing Issue from Feedback​

const removeIssueFromFeedback = async (
projectId,
channelId,
feedbackId,
issueId
) => {
const response = await fetch(
`/api/projects/${projectId}/channels/${channelId}/feedbacks/${feedbackId}/issues/${issueId}`,
{
method: "DELETE",
headers: {
"X-API-KEY": "your-api-key-here",
},
}
);

return await response.json();
};

// Usage example
const result = await removeIssueFromFeedback(1, 1, 123, 456);
console.log("Issue removed:", result);

4. Project and Channel Information​

Project Information Query​

const getProjectInfo = async (projectId) => {
const response = await fetch(`/api/projects/${projectId}`, {
method: "GET",
headers: {
"X-API-KEY": "your-api-key-here",
},
});

return await response.json();
};

// Usage example
const project = await getProjectInfo(1);
console.log("Project information:", project);

Channel Field Query​

const getChannelFields = async (projectId, channelId) => {
const response = await fetch(
`/api/projects/${projectId}/channels/${channelId}/fields`,
{
method: "GET",
headers: {
"X-API-KEY": "your-api-key-here",
},
}
);

return await response.json();
};

// Usage example
const fields = await getChannelFields(1, 1);
console.log("Channel fields:", fields);

API Testing via Swagger​

ABC User Feedback provides Swagger UI to easily test and understand the API.

Swagger Access Method​

Access via API server address + /docs:

https://your-domain.com/api/docs

Or in ReDoc format:

https://your-domain.com/api/docs/redoc

Setting API Key in Swagger​

  1. Click the "Authorize" button at the top of Swagger UI
  2. Enter the issued API key in the X-API-KEY field
  3. Click "Authorize" to complete authentication

After this, all API requests will automatically include the API key for testing.

Swagger Usage Tips​

  • Use "Try it out" button to test actual API calls
  • Check actual response data structure in Response body section
  • View detailed request/response data format in Schema tab
  • Generate cURL commands automatically for CLI testing

Error Handling and Retry Logic​

HTTP Status Codes​

Status CodeMeaningHandling Method
200SuccessNormal processing
400Bad RequestValidate request data
401Authentication FailedCheck API key
403ForbiddenCheck project access permissions
404Not FoundCheck ID value
429Rate Limit ExceededRetry after a moment
500Server ErrorRetry or contact support team

Response Data Parsing Method​

Pagination Response Structure​

{
"meta": {
"itemCount": 10,
"totalItems": 100,
"itemsPerPage": 10,
"totalPages": 10,
"currentPage": 1
},
"items": [
{
"id": 1,
"message": "Feedback content",
"createdAt": "2024-01-01T00:00:00.000Z",
"issues": [
{
"id": 1,
"name": "Issue name"
}
]
}
]
}

Security and Performance Optimization​

API Key Security​

  • Use environment variables: Manage API keys as environment variables
  • Server side only: Do not expose API keys to clients
  • Key rotation: Regularly replace API keys
  • IP whitelist: Allow access only from specific IPs when possible

Performance Optimization​

  • Use pagination: Set appropriate limit when querying large amounts of data
  • Request only needed fields: Improve response speed through query optimization
  • Caching strategy: Cache frequently queried data on client side
  • Batch processing: Process multiple requests together