���ѧۧݧ�ӧ�� �ާ֧ߧ֧էا֧� - ���֧էѧܧ�ڧ��ӧѧ�� - /home/alphpwcp/public_html/us/alphachat/modules/lhrestapi/swagger.json
���ѧ٧ѧ�
{ "swagger": "2.0", "info": { "description": "Live Helper Chat API description. You have to authorize to use API. Create API key in Live Helper Chat back office. During authorization provide operator username and key instead of password.\nDatabase schema definition can be found at https://dbdiagram.io/d/Live-Helper-Chat-67e68aa04f7afba184913d62", "version": "1.0.1", "title": "Live Helper Chat API", "termsOfService": "", "contact": { "email": "remdex@gmail.com", "name": "Live Helper Chat" }, "license": { "name": "", "url": "" } }, "host": "{{host}}", "basePath": "{{base_path}}", "tags": [ { "name": "chat", "description": "API Related to chats" }, { "name": "mail", "description": "API Related to mails" }, { "name": "survey", "description": "API Related to working with survey" }, { "name": "user", "description": "API Related to user" }, { "name": "file", "description": "API Related to working with a files" }, { "name": "bot", "description": "API Related to working with a bot" }, { "name": "department", "description": "API Related to department" }, { "name": "operators_chats", "description": "API Related to operators chats" }, { "name": "online", "description": "API Related to online status" }, { "name": "online_user", "description": "API Related to online users" }, { "name": "statistic", "description": "API Related to statistic" }, { "name": "Webhooks", "description": "API Related to webhooks" } ], "schemes": [ "https", "http" ], "paths": { "/restapi/conversations": { "get": { "tags": [ "mail" ], "summary": "Fetch mail conversations list. One conversation can have multiple main message in it. It's like a thread.", "description": "Required permissions - `lhmailconv`,`use_admin`. List content depends on assigned API user departments.", "produces": [ "application/json" ], "parameters": [ { "name": "department_ids[]", "in": "query", "description": "Department ID's", "required": false, "type": "array", "items":{ "type":"integer" }, "collectionFormat": "multi" }, { "name": "ids[]", "in": "query", "description": "Conversations IDs", "required": false, "type": "array", "items":{ "type":"integer" }, "collectionFormat": "multi" }, { "name": "department_group_ids[]", "in": "query", "description": "Department group ID's", "required": false, "type": "array", "items":{ "type":"integer" }, "collectionFormat": "multi" }, { "name": "user_ids[]", "in": "query", "description": "User IDs", "required": false, "type": "array", "items":{ "type":"integer" }, "collectionFormat": "multi" }, { "name": "mailbox_ids[]", "in": "query", "description": "Mailbox IDs", "required": false, "type": "array", "items": { "type": "integer" }, "collectionFormat": "multi" }, { "name": "conversation_status_ids[]", "in": "query", "description": "Conversation status IDs. const STATUS_PENDING = 0; const STATUS_ACTIVE = 1; const STATUS_CLOSED = 2;", "required": false, "type": "array", "items": { "type": "integer" }, "collectionFormat": "multi" }, { "name": "subject_id[]", "in": "query", "description": "Subject ID", "required": false, "type": "array", "items": { "type": "integer" }, "collectionFormat": "multi" }, { "name": "identifier[]", "in": "query", "description": "Department identifiers. Only plain string and numbers allowed.", "required": false, "type": "array", "items": { "type": "string" }, "collectionFormat": "multi" }, { "name": "limit", "in": "query", "description": "Limit", "required": false, "type": "string", "format": "int32" }, { "name": "offset", "in": "query", "description": "Offset", "required": false, "type": "string", "format": "int32" }, { "name": "id_gt", "in": "query", "description": "ID greater than", "required": false, "type": "string", "format": "int32" }, { "name": "timefromts", "in": "query", "description": "Time greater than. Unix timestamp. udate >=", "required": false, "type": "string", "format": "int32" }, { "name": "timetots", "in": "query", "description": "Time less than. Unix timestamp. udate <=", "required": false, "type": "string", "format": "int32" }, { "name": "include_messages", "description": "Include mail messages within conversation", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "count_records", "description": "Count total records by filter", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "phone", "description": "Phone", "required": false, "type": "string", "in": "query" }, { "name": "email", "description": "Email", "required": false, "type": "string", "in": "query" }, { "name": "subject", "description": "Mail subject", "required": false, "type": "string", "in": "query" }, { "name": "prefill_fields", "description": "What fields to prefill E.g mail_variables_array, customer_email, interaction_time_duration, plain_user_name, user, last_mail_front, conv_duration_front, wait_time_response,wait_time_pending, department_name, subject_front, mailbox, department, pnd_time_front, ctime_front, udate_front, accept_time_front, cls_time_front, lr_time_front, pnd_time_front_ago, ctime_front_ago, udate_front_ago, accept_time_front_ago, cls_time_front_ago, lr_time_front_ago", "required": false, "type": "string", "in": "query" }, { "name": "ignore_fields", "description": "What fields to skip E.g mail_variables_array, customer_email, interaction_time_duration, plain_user_name, user, last_mail_front, conv_duration_front, wait_time_response,wait_time_pending, department_name, subject_front, mailbox, department, pnd_time_front, ctime_front, udate_front, accept_time_front, cls_time_front, lr_time_front, pnd_time_front_ago, ctime_front_ago, udate_front_ago, accept_time_front_ago, cls_time_front_ago, lr_time_front_ago", "required": false, "type": "string", "in": "query" } ], "responses": { "200": { "description": "Fetch mail conversations list", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/chats": { "get": { "tags": [ "chat" ], "summary": "Fetch chats list", "description": "Required permissions - `lhchat`,`use`. List content depends on assigned API user departments.", "produces": [ "application/json" ], "parameters": [ {{chats_parameters}}{ "name": "departament_id", "in": "query", "description": "Department ID", "required": false, "type": "string", "format": "int32" }, { "name": "departament_ids", "in": "query", "description": "Department ID's", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "departament_groups_ids", "in": "query", "description": "Department group ID's", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "department_groups", "description": "Should we include department_groups attribute in response", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "identifier[]", "in": "query", "description": "Department identifiers. Only plain string and numbers allowed.", "required": false, "type": "array", "items": { "type": "string" }, "collectionFormat": "multi" }, { "name": "user_id", "in": "query", "description": "User ID", "required": false, "type": "string", "format": "int32" }, { "name": "user_ids", "in": "query", "description": "User IDs", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "online_user_id", "in": "query", "description": "Online user ID", "required": false, "type": "string", "format": "int32" }, { "name": "vid", "in": "query", "description": "Visitor unique ID", "required": false, "type": "string", "format": "int32" }, { "name": "phone", "in": "query", "description": "Phone", "required": false, "type": "string", "format": "int32" }, { "name": "email", "in": "query", "description": "Email", "required": false, "type": "string", "format": "int32" }, { "name": "nick", "in": "query", "description": "Nick", "required": false, "type": "string", "format": "int32" }, { "name": "status", "in": "query", "description": "Status. \nconst STATUS_PENDING_CHAT = 0;\n const STATUS_ACTIVE_CHAT = 1;\n const STATUS_CLOSED_CHAT = 2;\n const STATUS_CHATBOX_CHAT = 3;\n const STATUS_OPERATORS_CHAT = 4;\n const STATUS_BOT_CHAT = 5;", "required": false, "type": "string", "format": "int32" }, { "name": "status_ids", "in": "query", "description": "status_ids. \nconst STATUS_PENDING_CHAT = 0;\n const STATUS_ACTIVE_CHAT = 1;\n const STATUS_CLOSED_CHAT = 2;\n const STATUS_CHATBOX_CHAT = 3;\n const STATUS_OPERATORS_CHAT = 4;\n const STATUS_BOT_CHAT = 5;", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "has_operator", "description": "Has operator", "required": false, "type": "boolean", "default": "", "in": "query" }, { "name": "had_bot", "description": "Chat involved a bot. Means bot was assigned to the chat", "required": false, "type": "boolean", "default": "", "in": "query" }, { "name": "bot_ids", "description": "Bot ID's separated by comma", "required": false, "type": "boolean", "default": "", "in": "query" }, { "name": "include_survey", "description": "Include filled survey if it exists", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "limit", "in": "query", "description": "Limit", "required": false, "type": "string", "format": "int32" }, { "name": "delay", "in": "query", "description": "How many seconds has to be passed from chat start. It's usefull if you want to fetch chats older than n seconds. It's time in seconds from chat start.", "required": false, "type": "string", "format": "int32" }, { "name": "offset", "in": "query", "description": "Offset", "required": false, "type": "string", "format": "int32" }, { "name": "id_gt", "in": "query", "description": "ID greater than", "required": false, "type": "string", "format": "int32" }, { "name": "last_user_msg_time_gt", "in": "query", "description": "Last user message time greater than", "required": false, "type": "string", "format": "int32" }, { "name": "time_gt", "in": "query", "description": "Time greater than. Unix timestamp.", "required": false, "type": "string", "format": "int32" }, { "name": "time_lt", "in": "query", "description": "Time less than. Unix timestamp.", "required": false, "type": "string", "format": "int32" }, { "name": "include_messages", "description": "Include messages within chat", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "include_department", "description": "Include department within chat", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "group_by_nick", "description": "Group by nick", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "group_by_phone", "description": "Group by phone", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "meta_parse", "description": "Parse meta messages and use them in msg field", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "group_by_email", "description": "Group by e-mail.", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "prefill_fields", "description": "What fields to prefill E.g messages_statistic, subject, link, time_created_front, department_name, plain_user_name, product_name, n_official, n_off_full, wait_time_pending, wait_time_seconds, cls_time_front, tatus_sub_sub, can_edit_chat, unread_time, chat_actions", "required": false, "type": "string", "in": "query" }, { "name": "ignore_fields", "description": "What fields to skip E.g product_id, product, department, time, status, user, additional_data, additional_data_array, chat_variables, chat_variables_array", "required": false, "type": "string", "in": "query" } ], "responses": { "200": { "description": "Fetch chat list", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/chatscount": { "get": { "tags": [ "chat" ], "summary": "Get only number of chats", "description": "Required permissions - `lhchat`,`use`. List content depends on assigned API user departments.", "produces": [ "application/json" ], "parameters": [ {{chats_parameters}}{ "name": "departament_id", "in": "query", "description": "Department ID", "required": false, "type": "string", "format": "int32" }, { "name": "departament_groups_ids", "in": "query", "description": "Department group ID's", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "user_id", "in": "query", "description": "User ID", "required": false, "type": "string", "format": "int32" }, { "name": "user_ids", "in": "query", "description": "User IDs", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "online_user_id", "in": "query", "description": "Online user ID", "required": false, "type": "string", "format": "int32" }, { "name": "vid", "in": "query", "description": "Visitor unique ID", "required": false, "type": "string", "format": "int32" }, { "name": "phone", "in": "query", "description": "Phone", "required": false, "type": "string", "format": "int32" }, { "name": "email", "in": "query", "description": "Email", "required": false, "type": "string", "format": "int32" }, { "name": "nick", "in": "query", "description": "Nick", "required": false, "type": "string", "format": "int32" }, { "name": "status", "in": "query", "description": "Status. \nconst STATUS_PENDING_CHAT = 0;\n const STATUS_ACTIVE_CHAT = 1;\n const STATUS_CLOSED_CHAT = 2;\n const STATUS_CHATBOX_CHAT = 3;\n const STATUS_OPERATORS_CHAT = 4;\n const STATUS_BOT_CHAT = 5;", "required": false, "type": "string", "format": "int32" }, { "name": "status_ids", "in": "query", "description": "status_ids. \nconst STATUS_PENDING_CHAT = 0;\n const STATUS_ACTIVE_CHAT = 1;\n const STATUS_CLOSED_CHAT = 2;\n const STATUS_CHATBOX_CHAT = 3;\n const STATUS_OPERATORS_CHAT = 4;\n const STATUS_BOT_CHAT = 5;", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "delay", "in": "query", "description": "How many seconds has to be passed from chat start. It's usefull if you want to fetch chats older than n seconds. It's time in seconds from chat start.", "required": false, "type": "string", "format": "int32" }, { "name": "id_gt", "in": "query", "description": "ID greater than", "required": false, "type": "string", "format": "int32" }, { "name": "last_user_msg_time_gt", "in": "query", "description": "Last user message time greater than", "required": false, "type": "string", "format": "int32" }, { "name": "time_gt", "in": "query", "description": "Time greater than. Unix timestamp.", "required": false, "type": "string", "format": "int32" }, { "name": "group_by_nick", "description": "Group by nick", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "group_by_phone", "description": "Group by phone", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "group_by_email", "description": "Group by e-mail.", "required": false, "type": "boolean", "default": false, "in": "query" } ], "responses": { "200": { "description": "Fetch chat list", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/editwebhook": { "put": { "summary": "Update a webhook configuration", "description": "Updates the configuration and status of an existing webhook.", "operationId": "updateWebhook", "tags": ["Webhooks"], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "type": "integer", "description": "The ID of the webhook to update", "example": 42 }, "configuration": { "type": "string", "description": "JSON configuration for the webhook", "example": "{\"attr\": \"{args.chat.dep_id}\", \"condition\": \"neq\", \"value\": \"3\"}" }, "disabled": { "type": "integer", "description": "Whether the webhook is disabled", "example": "1 to disabled, 0 to enabled" } }, "required": ["id"] } } } }, "responses": { "200": { "description": "Webhook updated successfully", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "example": true }, "message": { "type": "string", "example": "Webhook updated successfully" }, "webhook_id": { "type": "integer", "example": 42 } } } } } }, "400": { "description": "Invalid parameters or webhook not found", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "boolean", "example": true }, "message": { "type": "string", "example": "Invalid parameters. ID is required." } } } } } } } } }, "/restapi/campaignsconversions": { "get": { "tags": [ "online_user" ], "summary": "Search for campaign conversions", "description": "Required permissions - `lhchat`, `administratecampaigs`", "produces": [ "application/json" ], "parameters": [ { "name": "department_id", "in": "query", "description": "Department ID", "required": false, "type": "string", "format": "int32" }, { "name": "campaign_id", "in": "query", "description": "Campaign id", "required": false, "type": "string", "format": "int32" }, { "name": "invitation_id", "in": "query", "description": "Invitation id", "required": false, "type": "string", "format": "int32" }, { "name": "chat_id", "in": "query", "description": "Chat id", "required": false, "type": "string", "format": "int32" }, { "name": "ctime", "in": "query", "description": "Create time greater than. Unix timestamp", "required": false, "type": "string", "format": "int32" }, { "name": "id", "in": "query", "description": "id greater than", "required": false, "type": "string", "format": "int32" }, { "name": "con_time", "in": "query", "description": "Conversion time greater than. Unix timestamp", "required": false, "type": "string", "format": "int32" }, { "name": "invitation_status", "in": "query", "description": "Invitation status.", "required": false, "type": "array", "items": { "type": "string", "enum": [ "send", "shown", "seen", "chat_started" ] } }, { "name": "invitation_type", "in": "query", "description": "Invitation type", "required": false, "type": "string", "format": "int32", "enum": [ "operator", "system" ] }, { "name": "device_type", "in": "query", "description": "Device type", "required": false, "type": "array", "items": { "type": "string", "enum": [ "pc", "mobile", "tablet" ] } }, { "name": "limit", "in": "query", "description": "Limit", "required": false, "type": "string", "format": "int32", "default": "20" }, { "name": "offset", "in": "query", "description": "Offset", "required": false, "type": "string", "format": "int32", "default": "0" }, { "name": "sort", "in": "query", "description": "sort order for id", "required": false, "default": "asc", "type": "string", "enum": [ "asc", "desc" ] }, { "name": "include_onlinevisitor", "description": "Include online visitor record data", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "include_invitation", "description": "Include invitation object", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "include_department", "description": "Include department object", "required": false, "type": "boolean", "default": false, "in": "query" } ], "responses": { "200": { "description": "Search for campaign conversions", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/fetchchat": { "get": { "tags": [ "chat" ], "summary": "Fetch chat information", "description": "Required permissions - `lhchat`,`use`.", "produces": [ "application/json" ], "parameters": [ { "name": "chat_id", "in": "query", "description": "Chat ID", "required": true, "type": "string", "format": "int32" }, { "name": "hash", "in": "query", "description": "Hash, optional variable. If provided it will be validated against chat hash also.", "required": false, "type": "string", "format": "int32" }, { "name": "department_groups", "description": "Should we include department_groups attribute in response", "required": false, "type": "boolean", "default": false, "in": "query" } ], "responses": { "200": { "description": "Fetch chat information", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/fetchchatmessages": { "get": { "tags": [ "chat" ], "summary": "Fetch chat messages", "description": "Required permissions - `lhchat`,`use`. Will API user get content - depends on assigned departments.", "produces": [ "application/json" ], "parameters": [ { "name": "chat_id", "in": "query", "description": "Chat ID", "required": true, "type": "string", "format": "int32" }, { "name": "workflow", "in": "query", "description": "Should workflow be executed. Like auto responder. Usefull if you are building visitors custom interface.", "required": false, "type": "string", "format": "int32" }, { "name": "last_message_id", "in": "query", "description": "Last message ID from which should be returned next messages.", "required": false, "type": "string", "format": "int32" }, { "name": "ignore_system_messages", "in": "query", "description": "Should system messages be ignored or not.", "required": false, "default": false, "type": "boolean" }, { "name": "extract_media", "in": "query", "description": "Should we include separate array of related files to a message?", "required": false, "default": false, "type": "boolean" }, { "name": "remove_bbcode", "in": "query", "description": "Return messages as plain text messages.", "required": false, "default": false, "type": "boolean" }, { "name": "remove_media", "in": "query", "description": "Remove bbcode tags from message if it's only file message?", "required": false, "default": false, "type": "boolean" }, { "name": "meta_parse", "description": "Parse meta messages and use them in msg field", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "as_html", "in": "query", "description": "Render message body as HTML instead of BBCode", "required": false, "default": false, "type": "boolean" }, { "name": "file_as_link", "in": "query", "description": "Render message files/images as links", "required": false, "default": false, "type": "boolean" } ], "responses": { "200": { "description": "Fetch chat messages", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/updatechatattributes": { "post": { "tags": [ "chat" ], "summary": "Updates chat attributes", "description": "Updates chat attributes.", "produces": [ "application/json" ], "parameters": [ { "name": "chat_id", "in": "formData", "description": "Chat ID", "required": true, "type": "string" }, { "name": "hash", "in": "formData", "description": "Hash", "required": true, "type": "string" }, { "name": "data", "in": "formData", "description": "Data as encoded JSON format. E.g {\"intent\":{\"val\":\"value\"}}", "required": true, "type": "string" } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/addmsguser": { "post": { "tags": [ "chat" ], "summary": "Add message to chat as a user", "description": "", "produces": [ "application/json" ], "parameters": [ { "name": "msg", "in": "formData", "description": "Message", "required": true, "type": "string" }, { "name": "chat_id", "in": "formData", "description": "Chat ID", "required": true, "type": "string" }, { "name": "hash", "in": "formData", "description": "Hash. If you skip hash make sure you set validation headers. Otherwise it is are not required to set validation header.", "required": false, "type": "string" } ], "responses": { "200": { "description": "Message added", "schema": { "$ref": "#/definitions/addmsguser" } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/addmsgadmin": { "post": { "tags": [ "chat" ], "summary": "Add message to chat as an admin", "description": "Required permissions - `lhchat`, `use` and assigned department.", "produces": [ "application/json" ], "parameters": [ { "name": "chat_id", "in": "formData", "description": "Chat ID", "required": true, "type": "string" }, { "name": "user_id", "in": "formData", "description": "Override Rest API user ID with a provided one.", "required": false, "type": "integer" }, { "name": "status", "in": "formData", "description": "Change chat status independently who is a sender.", "required": false, "type": "integer" }, { "name": "msg", "in": "formData", "description": "Message", "required": true, "type": "string" }, { "name": "sender", "in": "formData", "description": "Sender - `operator` / `bot` / `system` is sending a message. On it depends how Live Helper Chat will change chat statuses.", "required": true, "type": "string", "enum": [ "operator", "bot", "system" ] }, { "name": "meta_msg", "in": "formData", "description": "Meta body for a message", "required": false, "type": "string" }, { "name": "operator_name", "in": "formData", "description": "Set custom operator name for a message", "required": false, "type": "string" } ], "responses": { "200": { "description": "Message added", "schema": { "$ref": "#/definitions/addmsguser" } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/groupchat/addmessage/{group_chat_id}?rest_api=true": { "post": { "tags": [ "operators_chats" ], "summary": "Add message to a group chat", "description": "Used by mobile app.\nRequired permissions - `lhgroupchat`, `use`", "produces": [ "application/json" ], "parameters": [ { "name": "group_chat_id", "in": "path", "description": "Chat ID", "required": true, "type": "string" }, { "name": "msg", "in": "formData", "description": "Message", "required": true, "type": "string" } ], "responses": { "200": { "description": "Message added", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/setchatstatus": { "post": { "tags": [ "chat" ], "summary": "Set chat status", "description": "Changes chat status to provided one. Related logic is also executed in the background.\nRequired permissions - `lhchat`, `use` and assigned department.", "produces": [ "application/json" ], "parameters": [ { "name": "chat_id", "in": "formData", "description": "Chat ID", "required": true, "type": "string" }, { "name": "status", "in": "formData", "description": "0 - pending, 1 - active, 2 - closed chat, chat box chat - 3, operators chat - 4, bot chat - 5", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Chat status was changed", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/getuser": { "post": { "tags": [ "user" ], "summary": "Fetches user and verifies provided password", "description": "If user_id is provided. Systems tries to find provided user. If not system tries to find user by email or username. If password is provided it verifies provided password.\nIn order to fetch other user than yourself you have to have 'lhuser', 'userlist' permission.", "produces": [ "application/json" ], "parameters": [ { "name": "user_id", "in": "query", "description": "User ID", "required": false, "type": "string", "format": "int32" }, { "name": "username", "in": "query", "description": "Username", "required": false, "type": "string", "format": "int32" }, { "name": "email", "in": "query", "description": "E-mail", "required": false, "type": "string", "format": "int32" }, { "name": "password", "in": "query", "description": "Password", "required": false, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Fetch chat messages", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/user_departments": { "post": { "tags": [ "user" ], "summary": "Fetches user departments", "description": "If user_id is provided. Systems tries to find provided user. If not system returns authorised user departments.\nIn order to fetch other user than yourself you have to have 'lhuser', 'userlist' permission.", "produces": [ "application/json" ], "parameters": [ { "name": "user_id", "in": "query", "description": "User ID", "required": false, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Fetch user departments", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/getusers": { "get": { "tags": [ "user" ], "summary": "Fetches users", "description": "Returns list of all system users.\nIn order to fetch other user than yourself you have to have 'lhuser', 'userlist' permission.", "produces": [ "application/json" ], "parameters": [ { "name": "email", "in": "query", "description": "E-mail", "required": false, "type": "string", "format": "int32" }, { "name": "name", "in": "query", "description": "Name", "required": false, "type": "string", "format": "int32" }, { "name": "username", "in": "query", "description": "Username", "required": false, "type": "string", "format": "int32" }, { "name": "chat_nickname", "in": "query", "description": "Chat nickname", "required": false, "type": "string", "format": "int32" }, { "name": "surname", "in": "query", "description": "Surname", "required": false, "type": "string", "format": "int32" }, { "name": "disabled", "in": "query", "default": null, "description": "User status enabled/disabled. 0 - not disabled, 1 - disabled", "required": false, "type": "integer" }, { "name": "group_ids", "in": "query", "description": "User should be member of these group IDs", "required": false, "type": "array", "items":{ "type":"integer" } } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/user/{user_id}": { "get": { "tags": [ "user" ], "summary": "Fetches user by user ID", "description": "Required permission - 'lhuser', 'userlist' or be the owner of the user..", "produces": [ "application/json" ], "parameters": [ { "name": "user_id", "in": "path", "description": "User ID to fetch", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Returns user data", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "put": { "tags": [ "user" ], "summary": "Update a user", "description": "Required permission - 'lhuser', 'edituser' or be the owner of the user.", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "User object needs to be updated.", "required": true, "schema": { "$ref": "#/definitions/User" } }, { "name": "user_id", "in": "path", "description": "User to update.", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Updates user with specified attributes", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "delete": { "tags": [ "user" ], "summary": "Deletes specified user", "description": "Required permission - 'lhuser', 'deleteuser'", "produces": [ "application/json" ], "parameters": [ { "name": "user_id", "in": "path", "description": "User to delete. 'lhuser', 'deleteuser'", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Deletes specified user", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/file/{file_id}": { "get": { "tags": [ "file" ], "summary": "Fetches file by file id", "description": "`lhrestapi`, `file_download`", "produces": [ "application/json" ], "parameters": [ { "name": "file_id", "in": "path", "description": "File ID to fetch", "required": true, "type": "string", "format": "int32" }, { "name": "meta", "in": "query", "default": true, "description": "Fetch only meta information. Otherwise file content will be returned.", "required": false, "type": "boolean" } ], "responses": { "200": { "description": "Returns file data", "schema": { "$ref": "#/definitions/File" } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "put": { "tags": [ "file" ], "summary": "Update file meta data", "description": "Required permissions - `lhfile`, `use_operator`", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "File object needs to be updated", "required": true, "schema": { "$ref": "#/definitions/File" } }, { "name": "file_id", "in": "path", "description": "File to update", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Updates user with specified attributes", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "delete": { "tags": [ "file" ], "summary": "Deletes specified file", "description": "Required permission - `lhfile`, `file_delete`", "produces": [ "application/json" ], "parameters": [ { "name": "file_id", "in": "path", "description": "File to delete", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Deletes specified file", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/surveychat/{chat_id}/{survey_id}": { "get": { "tags": [ "survey" ], "summary": "Fetches survey by chat id", "description": "`lhrestapi`, `survey`", "produces": [ "application/json" ], "parameters": [ { "name": "chat_id", "in": "path", "description": "Chat ID to fetch", "required": true, "type": "string", "format": "int32" }, { "name": "survey_id", "in": "path", "description": "Survey ID. If you do not pass survey ID, all filled surveys related to the chat will be returned.", "required": false, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Returns filled survey data by chat", "schema": { "$ref": "#/definitions/Survey" } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "post": { "tags": [ "survey" ], "summary": "Update/Creates chat survey data", "description": "Required permissions - `lhrestapi`, `survey`", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "Survey object needs to be updated/created", "required": true, "schema": { "$ref": "#/definitions/Survey" } }, { "name": "chat_id", "in": "path", "description": "Chat ID", "required": true, "type": "string", "format": "int32" }, { "name": "survey_id", "in": "path", "description": "Survey ID.", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Updates chat survey with specified attributes", "schema": { } }, "400": { "description": "Internal error", "schema": { } }, "403": { "description": "Validation error", "schema": { } } }, "security": [ { "login": [] } ] }, "delete": { "tags": [ "survey" ], "summary": "Deletes specified survey data", "description": "Required permission - `lhrestapi`, `survey`", "produces": [ "application/json" ], "parameters": [ { "name": "chat_id", "in": "path", "description": "Chat ID", "required": true, "type": "string", "format": "int32" }, { "name": "survey_id", "in": "path", "description": "Survey ID. If you do not pass Survey ID, all related surveys to the chat will be deleted.", "required": false, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Deletes specified survey data if it exists", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/file": { "post": { "tags": [ "file" ], "summary": "Upload a file", "description": "Required permission - `lhfile`, `upload_new_file`", "consumes": [ "multipart/form-data" ], "parameters": [ { "in": "formData", "type": "file", "name": "files", "description": "Upload a file and returns it's meta data", "required": true }, { "in": "formData", "type": "string", "name": "name_prepend", "description": "You can prepend custom string to file name", "required": false }, { "in": "formData", "type": "string", "name": "name_replace", "description": "You can override file name.", "required": false }, { "in": "formData", "type": "boolean", "name": "persistent", "description": "Store file as persistent", "required": false }, { "in": "formData", "type": "integer", "name": "chat_id", "description": "Associated chat id", "required": false } ], "responses": { "200": { "description": "Creates a file and returns it's attributes", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/user": { "post": { "tags": [ "user" ], "summary": "Creates a new user", "description": "Required permission - 'lhuser', 'createuser'", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "Creates a user and returns it's data", "required": true, "schema": { "$ref": "#/definitions/User" } } ], "responses": { "200": { "description": "Creates a new user and returns it's attributes", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/notifications/{token}": { "get": { "tags": [ "user" ], "summary": "Returns notifications status", "description": "", "produces": [ "application/json" ], "parameters": [ { "name": "token", "in": "path", "description": "User session token", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Returns notifications status", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "post": { "tags": [ "user" ], "summary": "Enables/Disables mobile notifications", "description": "", "produces": [ "application/json" ], "parameters": [ { "name": "token", "in": "path", "description": "User session token", "required": true, "type": "string", "format": "int32" }, { "in": "body", "name": "body", "description": "Set's notifications status", "required": true, "schema": { "$ref": "#/definitions/Notifications" } } ], "responses": { "200": { "description": "Notifications status was changed", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/isonline": { "get": { "tags": [ "online" ], "summary": "Check is someone online", "description": "Returns global status is anyone online", "produces": [ "application/json" ], "parameters": [ { "name": "ignore_user_status", "in": "query", "description": "Ignore user status", "required": false, "type": "boolean" }, { "name": "include_users", "in": "query", "description": "Include operators status even if in departments settings it is chosen to ignore it.", "required": false, "type": "boolean" }, { "name": "exclude_online_hours", "in": "query", "description": "Exclude online hours", "required": false, "type": "boolean" } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } } } }, "/restapi/onlineusers": { "get": { "tags": [ "online" ], "summary": "Fetches online operators", "description": "Returns list of online operators. Required permissions - `lhuser`, `userlistonlineall`", "produces": [ "application/json" ], "parameters": [ { "name": "dep_id", "in": "query", "description": "Only users assigned to specified department.", "required": false, "type": "string", "format": "int32" }, { "name": "include_offline", "in": "query", "description": "Include also offline operators", "required": true, "type": "boolean", "default": false }, { "name": "exclude_invisible", "in": "query", "description": "Exclude invisible operators", "required": true, "type": "boolean", "default": false }, { "name": "include_disabled", "in": "query", "description": "Include disabled operators", "required": true, "type": "boolean", "default": false }, { "name": "include_user", "in": "query", "description": "Should we include a user object also with online record?", "required": true, "type": "boolean", "default": false } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/isonlinedepartment/{department_id}": { "get": { "tags": [ "online" ], "summary": "Check is department online", "description": "Returns status for particular department", "produces": [ "application/json" ], "parameters": [ { "name": "department_id", "in": "path", "description": "Department ID", "required": true, "type": "string", "format": "int32" }, { "name": "ignore_user_status", "in": "query", "description": "Ignore user status", "required": false, "type": "boolean" }, { "name": "include_users", "in": "query", "description": "Include operators status even if in departments settings it is chosen to ignore it.", "required": false, "type": "boolean" }, { "name": "exclude_bot", "in": "query", "description": "Exclude bot status", "required": false, "type": "boolean" }, { "name": "exclude_online_hours", "in": "query", "description": "Exclude online hours", "required": false, "type": "boolean" } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } } } }, "/restapi/isonlineuser/{user_id}": { "get": { "tags": [ "online" ], "summary": "Check is user online", "description": "Returns status for particular user", "produces": [ "application/json" ], "parameters": [ { "name": "user_id", "in": "path", "description": "User ID", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } } } }, "/restapi/isonlinechat/{chat_id}": { "get": { "tags": [ "online" ], "summary": "Check is user anyone from operators online for provided chat", "description": "Returns status for particular user", "produces": [ "application/json" ], "parameters": [ { "name": "chat_id", "in": "path", "description": "Chat ID", "required": true, "type": "string", "format": "int32" }, { "name": "ignore_user_status", "in": "query", "description": "Ignore user status", "required": false, "type": "boolean" }, { "name": "include_users", "in": "query", "description": "Include operators status even if in departments settings it is chosen to ignore it.", "required": false, "type": "boolean" }, { "name": "exclude_bot", "in": "query", "description": "Exclude bot status", "required": false, "type": "boolean" }, { "name": "exclude_online_hours", "in": "query", "description": "Exclude online hours", "required": false, "type": "boolean" } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } } } }, "/restapi/groupsbyobject/{object_id}/{type}": { "get": { "tags": [ "user" ], "summary": "Returns objects by object id and type", "description": "Is used to get objects by object id and type. This can be used in third party software to have custom permissions.\nRequired permissions - `lhrestapi`, `object_api`", "produces": [ "application/json" ], "parameters": [ { "name": "object_id", "in": "path", "description": "Object ID", "required": true, "type": "string", "format": "int32" }, { "name": "type", "in": "path", "description": "Type ID", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/groupsidbyobject/{object_id}/{type}": { "get": { "tags": [ "user" ], "summary": "Returns list of groups id by object id and type", "description": "Is used to get list of groups by object id and type. This can be used in third party software to have custom permissions.\nRequired permissions - `lhrestapi`, `object_api`", "produces": [ "application/json" ], "parameters": [ { "name": "object_id", "in": "path", "description": "Object ID", "required": true, "type": "string", "format": "int32" }, { "name": "type", "in": "path", "description": "Type ID", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/listofobjectid/{user_id}/{type}": { "get": { "tags": [ "user" ], "summary": "Returns list of objects user can access by user id and type of object", "description": "Required permissions - `lhrestapi`, `object_api`", "produces": [ "application/json" ], "parameters": [ { "name": "user_id", "in": "path", "description": "User ID", "required": true, "type": "string", "format": "int32" }, { "name": "type", "in": "path", "description": "Type ID", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/updatelastactivity/{user_id}": { "get": { "tags": [ "user" ], "summary": "Updates last operator activity. So chat considers operator as online", "description": "Updates last operator activity. So chat considers operator as online.\nRequired permissions - `lhrestapi`, `updatelastactivity` or to be an owner of an object", "produces": [ "application/json" ], "parameters": [ { "name": "user_id", "in": "path", "description": "User ID", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/setonlinestatus/{user_id}/{online}": { "get": { "tags": [ "user" ], "summary": "Changes operator status to offline or online", "description": "Updates operator status to online or offline.\nRequired to change yourself status - `lhuser`, `changeonlinestatus`\nRequired to change other user status - `lhuser`, `edituser`", "produces": [ "application/json" ], "parameters": [ { "name": "user_id", "in": "path", "description": "User ID", "required": true, "type": "string", "format": "int32" }, { "name": "online", "in": "path", "description": "1 - online, 0 - offline", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/generateautologin": { "post": { "tags": [ "user" ], "summary": "Will generate autologin link.", "description": "Required - `lhuser`, `userautologin`", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "Generates autologin link.", "required": true, "schema": { "$ref": "#/definitions/Autologin" } } ], "responses": { "200": { "description": "Login", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/login": { "post": { "tags": [ "user" ], "summary": "Login to application, also registers device if required", "description": "", "produces": [ "application/json" ], "parameters": [ { "name": "username", "in": "formData", "description": "Username", "required": true, "type": "string", "format": "int32" }, { "name": "password", "in": "formData", "description": "Password", "required": true, "type": "string" }, { "name": "generate_token", "in": "formData", "description": "Should we generate authentification/session token", "required": false, "type": "boolean" }, { "name": "device_token", "in": "formData", "description": "Device token", "required": false, "type": "string" }, { "name": "device", "in": "formData", "description": "Device type", "required": false, "type": "string", "enum": [ "unknown", "ios", "android" ] } ], "responses": { "200": { "description": "Login", "schema": { } }, "400": { "description": "Error", "schema": { } } } } }, "/restapi/loginbytoken": { "get": { "tags": [ "user" ], "summary": "Logins user by token", "description": "", "parameters": [ { "name": "token", "in": "query", "description": "Token", "required": true, "type": "string", "format": "int32" }, { "name": "r", "in": "query", "description": "Redirect url", "required": false, "type": "string", "format": "int32" }, { "name": "api", "description": "Is it api mode", "required": false, "type": "boolean", "default": true, "in": "query" } ], "responses": { "200": { "description": "Login", "schema": { } }, "400": { "description": "Error", "schema": { } } } } }, "/restapi/logout": { "post": { "tags": [ "user" ], "summary": "Revokes token if it's found", "description": "", "produces": [ "application/json" ], "parameters": [ { "name": "token", "in": "formData", "description": "Token", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Login", "schema": { } }, "400": { "description": "Error", "schema": { } } } } }, "/restapi/bots": { "get": { "tags": [ "bot" ], "summary": "Bot list", "description": "Required permissions - `lhgenericbot`, `use`", "produces": [ "application/json" ], "parameters": [ { "name": "attr_str_1", "in": "query", "description": "Custom attribute attr_str_1 (exact match)", "required": false, "type": "string", "format": "int32" }, { "name": "attr_str_2", "in": "query", "description": "Custom attribute attr_str_2 (exact match)", "required": false, "type": "string", "format": "int32" }, { "name": "attr_str_3", "in": "query", "description": "Custom attribute attr_str_3 (exact match)", "required": false, "type": "string", "format": "int32" }, { "name": "name", "in": "query", "description": "Name like %name%", "required": false, "type": "string", "format": "int32" }, { "name": "nick", "in": "query", "description": "Nick like %nick%", "required": false, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Returns list of bots", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/startchatwithoperator/{user_id}/{init_user_id}": { "get": { "tags": [ "operators_chats" ], "summary": "Start a chat with an operator", "description": "Required permission - `lhgroupchat`, `use`", "produces": [ "application/json" ], "parameters": [ { "name": "user_id", "in": "path", "description": "With what operator you want to start a chat", "required": true, "type": "string", "format": "int32" }, { "name": "init_user_id", "in": "path", "description": "User ID who is initializing a chat. If you ommit this, user who is executing Rest API call will be used.", "required": false, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Returns data of operators chats", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/groupchat/sync?rest_api=true": { "post": { "tags": [ "operators_chats" ], "summary": "Sync for a new group chat messages", "description": "Required permissions - `lhgroupchat`, `use`", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "Sync request body", "required": true, "schema": { "$ref": "#/definitions/User" } } ], "responses": { "200": { "description": "Returns list of messages for group chats", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/departments": { "get": { "tags": [ "department" ], "summary": "Departments list", "description": "Required permissions - `lhdepartment`, `list`", "produces": [ "application/json" ], "parameters": [ { "name": "attr_int_1", "in": "query", "description": "Custom attribute attr_int_1 (exact match)", "required": false, "type": "integer", "format": "int32" }, { "name": "attr_int_2", "in": "query", "description": "Custom attribute attr_int_2 (exact match)", "required": false, "type": "integer", "format": "int32" }, { "name": "attr_int_3", "in": "query", "description": "Custom attribute attr_int_3 (exact match)", "required": false, "type": "integer", "format": "int32" }, { "name": "email", "in": "query", "description": "Custom attribute email (exact match)", "required": false, "type": "string", "format": "int32" }, { "name": "name", "in": "query", "description": "Name like %name%", "required": false, "type": "string", "format": "int32" }, { "name": "identifier", "in": "query", "description": "Custom attribute identifier (exact match)", "required": false, "type": "string", "format": "int32" }, { "name": "disabled", "in": "query", "description": "Disabled", "required": false, "type": "integer", "format": "int32" }, { "name": "hidden", "in": "query", "description": "Hidden", "required": false, "type": "integer", "format": "int32" } ], "responses": { "200": { "description": "Returns list of departments", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/extensions": { "get": { "tags": [ "system" ], "summary": "List of activated extensions", "description": "Required permissions - `lhrestapi`, `list_extensions`", "produces": [ "application/json" ], "parameters": [ ], "responses": { "200": { "description": "Returns list of activated extensions", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/department": { "post": { "tags": [ "department" ], "summary": "Create a new department", "description": "Required permissions - `lhdepartment`, `create`", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "Department object that needs to be added to the lhc", "required": true, "schema": { "$ref": "#/definitions/Department" } } ], "responses": { "200": { "description": "Creates a department with provided attributes", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/department/{department_id}": { "get": { "tags": [ "department" ], "summary": "Department to fetch", "description": "Required permissions - 'lhdepartment', 'list'", "produces": [ "application/json" ], "parameters": [ { "name": "department_id", "in": "path", "description": "Department to fetch", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Fetches department data", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "put": { "tags": [ "department" ], "summary": "Update a department", "description": "Required permissions - `lhdepartment`, `edit`", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "Bot object that needs to be added to the lhc", "required": true, "schema": { "$ref": "#/definitions/Department" } }, { "name": "department_id", "in": "path", "description": "Department to update", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Updates department with specified attributes", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "delete": { "tags": [ "department" ], "summary": "Deletes specified department", "description": "Required permissions - `lhdepartment`, `delete`", "produces": [ "application/json" ], "parameters": [ { "name": "department_id", "in": "path", "description": "Department to delete", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Deletes specified department", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/bot": { "post": { "tags": [ "bot" ], "summary": "Create a bot", "description": "Required permissions - `lhgenericbot`, `use`", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "Bot object that needs to be added to the lhc", "required": true, "schema": { "$ref": "#/definitions/Bot" } } ], "responses": { "200": { "description": "Creates a bot with provided attributes", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/chat/{chat_id}": { "put": { "tags": [ "chat" ], "summary": "Update a chat", "description": "Required permissions - `lhchat`,`use` and assigned department in write mode.", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "Chat object that needs to be modified in Live Helper Chat", "required": true, "schema": { "$ref": "#/definitions/Chat" } }, { "name": "chat_id", "in": "path", "description": "Chat ID to update", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Updates chat with specified attributes", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "delete": { "tags": [ "chat" ], "summary": "Delete a chat", "description": "Required permissions - `lhchat`,`use` and assigned department in write mode and 'lhchat','deleteglobalchat' or being chat owner with 'lhchat','deletechat' permission", "produces": [ "application/json" ], "parameters": [ { "name": "chat_id", "in": "path", "description": "Chat ID to delete", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Deletes specified chat", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "get": { "tags": [ "chat" ], "summary": "Fetch chat information", "description": "Required permissions - `lhchat`,`use` and assigned department", "produces": [ "application/json" ], "parameters": [ { "name": "chat_id", "in": "path", "description": "Chat ID", "required": true, "type": "string", "format": "int32" }, { "name": "hash", "in": "query", "description": "Hash, optional variable. If provided it will be validated against chat hash also.", "required": false, "type": "string", "format": "int32" }, { "name": "department_groups", "description": "Should we include department_groups attribute in response", "required": false, "type": "boolean", "default": false, "in": "query" }, { "name": "attr", "description": "What magic attributes we should include. Separated by comma. E.g user,number_in_queue,unread_time Etc. See https://github.com/LiveHelperChat/livehelperchat/blob/master/lhc_web/lib/models/lhchat/erlhcoreclassmodelchat.php#L226", "required": false, "type": "string", "default": "", "in": "query" } ], "responses": { "200": { "description": "Fetch chat information", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/chat": { "post": { "tags": [ "chat" ], "summary": "Creates a new chat", "description": "", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "Creates a chat and returns it's data", "required": true, "schema": { "$ref": "#/definitions/NewChat" } } ], "responses": { "200": { "description": "Creates a chat and returns it's attributes", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/bot/{bot_id}": { "put": { "tags": [ "bot" ], "summary": "Update a bot", "description": "Required permissions - `lhgenericbot`, `use`", "produces": [ "application/json" ], "parameters": [ { "in": "body", "name": "body", "description": "Bot object that needs to be added to the lhc.", "required": true, "schema": { "$ref": "#/definitions/Bot" } }, { "name": "bot_id", "in": "path", "description": "Bot ID to update", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Updates bot with specified attributes", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] }, "delete": { "tags": [ "bot" ], "summary": "Deletes specified bot.", "description": "Required permissions - `lhgenericbot`, `use`", "produces": [ "application/json" ], "parameters": [ { "name": "bot_id", "in": "path", "description": "Bot ID to update", "required": true, "type": "string", "format": "int32" } ], "responses": { "200": { "description": "Deletes specified bot", "schema": { } }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }, "/restapi/agentstatistic": { "get": { "tags": [ "statistic" ], "summary": "Fetches agent statistic", "description": "Required permissions - `lhstatistic`, `viewstatistic`", "produces": [ "application/json" ], "parameters": [ { "name": "timefrom", "in": "query", "description": "From datetime.", "required": false, "type": "string" }, { "name": "timeto", "in": "query", "description": "To datetime.", "required": false, "type": "string" }, { "name": "group_ids", "in": "query", "description": "Users groups ids.", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "department_ids", "in": "query", "description": "Department ids.", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "department_group_ids", "in": "query", "description": "Department groups ids.", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "subject_ids", "in": "query", "description": "Subjects ids.", "required": false, "type": "array", "items":{ "type":"integer" } }, { "name": "user_ids", "in": "query", "description": "Users ids.", "required": false, "type": "array", "items":{ "type":"integer" } } ], "responses": { "200": { "description": "Returns agents statistic" }, "400": { "description": "Error", "schema": { } } }, "security": [ { "login": [] } ] } }{{append_paths}} }, "securityDefinitions": { "login": { "type": "basic", "description": "Basic authentication" } }, "definitions": { {{append_definitions}}"ElasticChat": { "type": "object", "description": "If you are using ElasticSearch extension. In addition to a Chat fields you will have these attributes available.", "properties": { "id": { "type": "integer", "description": "Same as main chat ID", "example": null }, "location": { "type": "geo", "description": "ElasticSearch location attribute", "example": null }, "time": { "type": "integer", "description": "ElasticSearch time attribute", "example": 1639632860000 }, "pnd_time": { "type": "integer", "description": "ElasticSearch time attribute", "example": 1639632860000 }, "cls_time": { "type": "integer", "description": "ElasticSearch time attribute", "example": 1639632860000 }, "abnd": { "type": "integer", "description": "Abandoned chat", "example": 0 }, "drpd": { "type": "integer", "description": "Dropped chat", "example": 0 }, "subject_id": { "type": "array", "description": "Holds an array of of assigned subjects id's. Array of numbers", "example": [1,2] }, "hour": { "type": "integer", "description": "Chat start hour in UTC time zone.", "example": 12 }, "msg_visitor": { "type": "integer", "description": "Contains only visitor messages text", "example": null }, "msg_operator": { "type": "integer", "description": "Contains only operator messages text", "example": null }, "msg_system": { "type": "integer", "description": "Contains only system messages text", "example": null }, "hvf": { "type": "integer", "description": "Has uploaded file from visitor", "example": null }, "hof": { "type": "integer", "description": "Has uploaded file from operator", "example": null }{{append_elastic_definitions}} } }, "Chat": { "type": "object", "properties": { "id": { "type": "integer", "description": "Unque Chat ID", "example": null }, "nick": { "type": "string", "default": "Visitor", "description": "Visitor nick", "example": "Visitor" }, "status": { "type": "integer", "description": "const STATUS_PENDING_CHAT = 0;\nconst STATUS_ACTIVE_CHAT = 1;\nconst STATUS_CLOSED_CHAT = 2;\nconst STATUS_CHATBOX_CHAT = 3;\nconst STATUS_OPERATORS_CHAT = 4;\nconst STATUS_BOT_CHAT = 5;", "example": null }, "status_sub": { "type": "integer", "description": "const STATUS_SUB_DEFAULT = 0;\n const STATUS_SUB_OWNER_CHANGED = 1;\n const STATUS_SUB_CONTACT_FORM = 2;\n const STATUS_SUB_USER_CLOSED_CHAT = 3;\n const STATUS_SUB_START_ON_KEY_UP = 4;\n const STATUS_SUB_SURVEY_SHOW = 5;\n const STATUS_SUB_SURVEY_COLLECTED = 6;\n const STATUS_SUB_OFFLINE_REQUEST = 7;\n const STATUS_SUB_ON_HOLD = 8;", "example": null }, "status_sub_arg": { "type": "string", "description": "Custom arguments for sub status", "example": null }, "status_sub_sub": { "type": "integer", "description": " const STATUS_SUB_SUB_DEFAULT = 0;\n const STATUS_SUB_SUB_TRANSFERED = 1;\n const STATUS_SUB_SUB_CLOSED = 2; // Chat was previously closed, but became pending again.", "example": null }, "sender_user_id": { "type": "integer", "description": "What operator (id) transferred chat", "example": null }, "time": { "type": "integer", "description": "Chat creation time in unix timestamp", "example": null }, "user_id": { "type": "integer", "description": "To what operator chat is assigned", "example": null }, "hash": { "type": "string", "description": "Security hash. Used to check that visitor has access to chat.", "example": null }, "ip": { "type": "string", "description": "Visitor IP", "example": null }, "referrer": { "type": "string", "description": "Referrer page. From what page customer come to website.", "example": null }, "dep_id": { "type": "integer", "description": "To what department chat belongs to", "example": null }, "email": { "type": "string", "description": "Customer e-mail", "example": null }, "user_status": { "type": "integer", "description": " const USER_STATUS_JOINED_CHAT = 0;\n const USER_STATUS_CLOSED_CHAT = 1;\n const USER_STATUS_PENDING_REOPEN = 2;", "example": null }, "cls_us": { "type": "integer", "description": "User status on chat close event. 0 - undetermined, 1 - visitor was online, 2 - visitor was offline", "example": null }, "country_code": { "type": "string", "description": "Two letter country code", "example": null }, "country_name": { "type": "string", "description": "Full country name", "example": null }, "user_typing": { "type": "integer", "description": "Holds timestamp then visitor started typing. Is updated constantly while visitor is typing.", "example": null }, "user_typing_txt": { "type": "string", "description": "Visitor typing text", "example": null }, "last_user_msg_time": { "type": "string", "description": "Time of of last visitor message", "example": null }, "last_op_msg_time": { "type": "string", "description": "Time of of last operator message", "example": null }, "operator_typing": { "type": "integer", "description": "Operator started typing. Stores timestamp then it started.", "example": null }, "operator_typing_id": { "type": "integer", "description": "Stores what operator started typing.", "example": null }, "phone": { "type": "string", "description": "Customer phone", "example": null }, "has_unread_messages": { "type": "integer", "description": "Has operator unread messages from visitor. 0 - no, 1 - yes", "example": null }, "has_unread_op_messages": { "type": "integer", "description": "Has visitor unread messages from operator. 0 - no, 1 - yes", "example": null }, "last_msg_id": { "type": "integer", "description": "Last chat message id", "example": null }, "mail_send": { "type": "integer", "description": "Was mail send to customer. 0 - no, 1 - yes", "example": null }, "lat": { "type": "string", "description": "Latitude of visitor location", "example": null }, "lon": { "type": "string", "description": "Longitute of visitor location", "example": null }, "city": { "type": "string", "description": "Detected visitor city", "example": null }, "additional_data": { "type": "string", "description": "Stores additional passed chat data in JSON format.", "example": null }, "session_referrer": { "type": "string", "description": "From what page chat was started.", "example": null }, "wait_time": { "type": "integer", "description": "How long visitor waited for chat being accepted.", "example": null }, "chat_duration": { "type": "integer", "description": "How long chat took. Calculated on chat close.", "example": null }, "chat_variables": { "type": "string", "description": "Chat variables. These can store custom chat data accessed only by extensions/bot rest api. Stored as JSON encoded format. E.g {\"intent\":\"value\"}", "example": null }, "priority": { "type": "integer", "description": "Chat priority in pending chat list. Also used in auto assign workflow.", "example": null }, "chat_initiator": { "type": "integer", "description": "How chat was initialized.\nconst CHAT_INITIATOR_DEFAULT = 0;\n const CHAT_INITIATOR_PROACTIVE = 1;", "example": null }, "user_tz_identifier": { "type": "string", "description": "Visitor timezone detected.", "example": null }, "user_closed_ts": { "type": "string", "description": "Timestamp then visitor closed a widget.", "example": null }, "lsync": { "type": "string", "description": "Last time visitor checked for new messages. Updated every 30 seconds from last update.", "example": null }, "online_user_id": { "type": "string", "description": "Online user record ID", "example": null }, "unread_messages_informed": { "type": "integer", "description": "Have we informed operator by e-mail. Etc. That there is unread chat messages from visitor.", "example": null }, "unread_op_messages_informed": { "type": "integer", "description": "Have we informed visitor by e-mail. Etc. that there is unread chat messages from operator.", "example": null }, "reinform_timeout": { "type": "integer", "description": "If messages stays for defined amount unread in seconds we should inform operator about unread message.", "example": null }, "auto_responder_id": { "type": "integer", "description": "Auto responder ID", "example": null }, "transfer_timeout_ts": { "type": "integer", "description": "Stores timestamp when the last transfer between departmetns accoured.", "example": null }, "transfer_timeout_ac": { "type": "integer", "description": "Stores value how long change be pending before it's transfered to another department.", "example": null }, "transfer_if_na": { "type": "integer", "description": "Transfer between departments enabled for this chat.", "example": null }, "transfer_uid": { "type": "integer", "description": "Stores the user ID who transfered the chat.", "example": null }, "na_cb_executed": { "type": "integer", "description": "Unanswered chat callback was executed. It's execution are based on 'run_unaswered_chat_workflow' value. erLhcoreClassChatWorkflow::unansweredChatWorkflow", "example": null }, "nc_cb_executed": { "type": "integer", "description": "Stores indication that new chat informing workflow was executed.", "example": null }, "fbst": { "type": "integer", "description": "0 - No feedback left. 1 - Up voted. 2 - Down voted.", "example": null }, "remarks": { "type": "string", "description": "Operator remarks", "example": null }, "operation": { "type": "string", "description": "What operation is pending visitor? Holds javascript to executed.", "example": null }, "operation_admin": { "type": "string", "description": "What operation is pending operator? Holds javascript to executed.", "example": null }, "screenshot_id": { "type": "integer", "description": "File id which holds screenshot.", "example": null }, "tslasign": { "type": "integer", "description": "Timestamp since last auto assignment. Used in chat auto balancing.", "example": null }, "usaccept": { "type": "integer", "description": "Operator status while they were accepting chat", "example": null }, "chat_locale": { "type": "string", "description": "Visitor language", "example": null }, "chat_locale_to": { "type": "string", "description": "Operator language", "example": null }, "unanswered_chat": { "type": "integer", "description": "Was chat unanswered before user has left a chat", "example": null }, "product_id": { "type": "integer", "description": "Product ID", "example": null }, "invitation_id": { "type": "integer", "description": "By what invitation chat was started", "example": null }, "uagent": { "type": "integer", "description": "Visitor user agent", "example": null }, "device_type": { "type": "integer", "description": "0 - PC, 1 - mobile, 2 - tablet", "example": null }, "pnd_time": { "type": "integer", "description": "Time then chat became pending. Unix timestamp.", "example": null }, "cls_time": { "type": "integer", "description": "Time then chat was closed. Unix timestamp.", "example": null }, "anonymized": { "type": "integer", "description": "Was chat data anonymized. 0 - no, 1 - yes", "example": null }, "last_msg_time": { "type": "string", "description": "Magic attribute. This is the max of (last_user_msg_time, last_op_msg_time)", "example": null }, "time_created_front": { "type": "string", "description": "Magic attribute. Time in human readable format when chat was created. uses - time", "example": null }, "pnd_time_front": { "type": "string", "description": "Magic attribute. Time in human readable format when chat become pending. uses - pnd_time", "example": null }, "cls_time_front": { "type": "string", "description": "Magic attribute. Time in human readable format when chat was closed. uses - cls_time", "example": null }, "wait_time_seconds": { "type": "string", "description": "Magic attribute. How long chat is pending for being accepted. Value in seconds. uses - time() - max(time,pnd_time)", "example": null }, "wait_time_front": { "type": "string", "description": "Magic attribute. How long chat was pending before being accepted. Value in seconds. Uses - wait_time", "example": null }, "number_in_queue": { "type": "string", "description": "Magic attribute. Number in the queue.", "example": null }, "hum": { "type": "string", "description": "Magic attribute. Has chat unread messages and from last visitor message already passed 7 seconds.", "example": null }, "additional_data_array": { "type": "string", "description": "Magic attribute. json_decoded array of additional_data attribute.", "example": null }, "chat_variables_array": { "type": "string", "description": "Magic attribute. json_decoded array of chat_variables", "example": null }, "bot": { "description": "Magic attribute. Bot object. User bot_id to fetch bot", "$ref": "#/definitions/Bot" }, "department": { "description": "Magic attribute. Bot object. Uses dep_id to fetch bot", "$ref": "#/definitions/Department" }, "frt": { "type": "integer", "default": 0, "description": "First time response delay. How long agent took to write first message after chat acceptance." }, "aart": { "type": "integer", "default": 0, "description": "Average agent response time. Average how long agents took to write response to visitor messages." }, "mart": { "type": "integer", "default": 0, "description": "Maximum agent response time. Maximum amount of time agent took to write visitor a message." } }, "example" : { "nick" : "Visitor" } }, "Bot": { "type": "object", "properties": { "name": { "type": "string", "default": "name", "required": true, "description": "Name of the bot" }, "nick": { "type": "string", "default": "nick", "required": true, "description": "Nick visible by customer" }, "configuration": { "type": "string", "description": "Configuration attributes. Leave it empty just.", "example": null }, "attr_str_1": { "type": "string", "description": "Field can be used by extensions", "example": null }, "attr_str_2": { "type": "string", "description": "Field can be used by extensions", "example": null }, "attr_str_3": { "type": "string", "description": "Field can be used by extensions", "example": null }, "image": { "type": "string", "format": "byte", "description": "Image content encoded with base64_encode" } }, "example" : { "name" : "Name of the bot", "nick" : "Nick of the bot" } }, "Notifications": { "type": "object", "properties": { "status": { "type": "boolean", "default": false, "required": false, "description": "" } }, "example" : { "status" : true } }, "Autologin": { "type": "object", "properties": { "u": { "type": "string", "default": "", "required": true, "description": "u - stands for User ID under which user should be logged in. User ID you can find in users lists." }, "l": { "type": "string", "default": "nick", "required": true, "description": "l - is user login/username. It's optional. You have to pass either u or l but NOT both at the same time" }, "r": { "type": "string", "description": "r - stands for URL, it has to be module url without site_admin prefix. It can be also as chat/single/5993", "example": null }, "t": { "type": "string", "description": "t - stands how long auto login link should be valid. It's value in second. In the example link is valid for 60 seconds after it's genration. Also you can ommit this argument, that means link never expires. I suggest always pass some timestamp for this.", "example": null } }, "example" : { "u" : 1, "l" : "admin", "r" : "front/default", "t" : 60 } }, "User": { "type": "object", "properties": { "id": { "type": "integer", "default": null, "required": false, "description": "User ID. This field is not updatable." }, "username": { "type": "string", "default": "", "required": false, "description": "Username" }, "password": { "type": "string", "default": "", "required": false, "description": "Password" }, "email": { "type": "string", "default": "", "required": false, "description": "E-mail" }, "name": { "type": "string", "default": "", "required": false, "description": "Name of the operator" }, "surname": { "type": "string", "default": "", "required": false, "description": "Surname of the operator" }, "disabled": { "type": "boolean", "default": false, "required": false, "description": "Is user disabled" }, "hide_online": { "type": "boolean", "default": false, "required": false, "description": "User is offline if value is true" }, "all_departments": { "type": "boolean", "default": false, "required": false, "description": "User has access to all departments. This attribute is updated only if you provide also `departments` attribute." }, "image": { "type": "string", "format": "byte", "description": "Image content encoded with base64_encode. It's used to change operator profile photo." }, "filepath": { "type": "string", "default": "", "required": false, "description": "Filepath of operator image. This field is not updatable." }, "filename": { "type": "string", "default": "", "required": false, "description": "Filename of operator image. This field is not updatable." }, "skype": { "type": "string", "default": "", "required": false, "description": "Skype nick" }, "job_title": { "type": "string", "default": "", "required": false, "description": "Job title of operator. Visible in operator profile during the chat." }, "time_zone": { "type": "string", "default": "", "required": false, "description": "Timezone of operator. If empty system timezone is used." }, "invisible_mode": { "type": "boolean", "default": false, "required": false, "description": "Operator is invisible if true" }, "inactive_mode": { "type": "boolean", "default": false, "required": false, "description": "Operator goes offline because of inactivity. This field is not updatable." }, "xmpp_username": { "type": "string", "default": false, "required": false, "description": "XMPP username." }, "rec_per_req": { "type": "boolean", "default": false, "required": false, "description": "User will receive permission request if other operator request it." }, "session_id": { "type": "string", "default": "", "required": false, "description": "If one logic per account enabled we store in this field present session. This field is not updatable." }, "active_chats_counter": { "type": "integer", "default": 0, "required": false, "description": "Stores how many active chats current operator has. This field is not updatable." }, "force_logout": { "type": "integer", "default": 0, "required": false, "description": "Force logout, 0 - no, 1 - yes. User will be automatically logged out." }, "pending_chats_counter": { "type": "integer", "default": 0, "required": false, "description": "Stores how many pending chats current operator has. This field is not updatable." }, "departments_ids": { "type": "string", "default": "", "required": false, "description": "Stores departmetns id's assigned to user. This list also includes departments assigned by department group. 0 in list means all departments. Separated by comma. E.g 1,5,9,0" }, "chat_nickname": { "type": "string", "default": "", "required": false, "description": "Operator nick visible by visitor in a widget. If not provided we construct nick by name and surname." }, "max_active_chats": { "type": "string", "default": "", "required": false, "description": "How many active chats operator can have at single time. This limits auto assignment workflow." }, "auto_accept": { "type": "boolean", "default": false, "required": false, "description": "If chat is assigned to an operator tab will automatically open for him." }, "attr_int_1": { "type": "integer", "default": 0, "required": false, "description": "Custom integer attribute can be used by extension." }, "attr_int_2": { "type": "integer", "default": 0, "required": false, "description": "Custom integer attribute can be used by extension." }, "attr_int_3": { "type": "integer", "default": 0, "required": false, "description": "Custom integer attribute can be used by extension." }, "operation_admin": { "type": "string", "default": "", "required": false, "description": "We store javascritp in this field is pending for specific admin to be executed. This field is not updatable." }, "exclude_autoasign": { "type": "boolean", "default": false, "required": false, "description": "Exclude operator from autoassignment workflow." }, "pswd_updated": { "type": "boolean", "default": false, "required": false, "description": "Password update timestamp. This field is used for password requirements. This field is not updatable." }, "always_on": { "type": "boolean", "default": false, "required": false, "description": "Operator will be seen as always online. Even if they are logged out. Usefull in combination with telegram extension." }, "departments": { "type": "array", "default": [], "required": false, "description": "What departments ID's should be assigned to the operator" }, "departments_read": { "type": "array", "default": [], "required": false, "description": "What departments ID's should be in read mode only." }, "department_groups": { "type": "array", "default": [], "required": false, "description": "What departments groups ID's should be assigned to the operator" }, "user_groups": { "type": "array", "default": [], "required": false, "description": "To what user groups operator belongs" } }, "example" : { "username" : "username", "password" : "password", "email" : "exmaple@example.org", "name" : "Name", "surname" : "Surname", "chat_nickname" : "Chat nickname", "departments" : [1,2], "departments_read" : [2], "department_groups" : [1], "user_groups" : [1] } }, "Survey": { "type": "object", "example" : { "max_stars_1" : 5, "question_options_1": 1, "question_plain_1": "Plain answer" }, "properties": { "id": { "type": "integer", "default": null, "required": false, "description": "Filled survey ID" }, "survey_id": { "type": "integer", "default": null, "required": false, "description": "Survey ID" }, "chat_id": { "type": "integer", "default": null, "required": false, "description": "Chat ID" }, "user_id": { "type": "integer", "default": null, "required": false, "description": "User ID" }, "ftime": { "type": "integer", "default": null, "required": false, "description": "Fill time in unix timestamp" }, "dep_id": { "type": "integer", "default": null, "required": false, "description": "Department ID" }, "status": { "type": "integer", "default": "0", "required": false, "description": "Status. const STATUS_PERSISTENT = 0; const STATUS_TEMP = 1; Temporary status means visitor can refill survey." }, "max_stars_1": { "type": "integer", "default": null, "required": false, "description": "Starts number" }, "max_stars_2": { "type": "integer", "default": null, "required": false, "description": "Starts number" }, "max_stars_3": { "type": "integer", "default": null, "required": false, "description": "Starts number" }, "max_stars_4": { "type": "integer", "default": null, "required": false, "description": "Starts number" }, "max_stars_5": { "type": "integer", "default": null, "required": false, "description": "Starts number" }, "question_options_1": { "type": "integer", "default": null, "required": false, "description": "Answer number with options" }, "question_options_2": { "type": "integer", "default": null, "required": false, "description": "Answer number with options" }, "question_options_3": { "type": "integer", "default": null, "required": false, "description": "Answer number with options" }, "question_options_4": { "type": "integer", "default": null, "required": false, "description": "Answer number with options" }, "question_options_5": { "type": "integer", "default": null, "required": false, "description": "Answer number with options" }, "question_plain_1": { "type": "integer", "default": null, "required": false, "description": "Visitor answer to plain question" }, "question_plain_2": { "type": "integer", "default": null, "required": false, "description": "Visitor answer to plain question" }, "question_plain_3": { "type": "integer", "default": null, "required": false, "description": "Visitor answer to plain question" }, "question_plain_4": { "type": "integer", "default": null, "required": false, "description": "Visitor answer to plain question" }, "question_plain_5": { "type": "integer", "default": null, "required": false, "description": "Visitor answer to plain question" } } }, "File": { "type": "object", "properties": { "id": { "type": "integer", "default": null, "required": false, "description": "File ID" }, "name": { "type": "string", "default": "", "required": false, "description": "System file name" }, "upload_name": { "type": "string", "default": "", "required": false, "description": "Uploaded file name. This name is used to render file name for the vistior." }, "type": { "type": "string", "default": "", "required": false, "description": "Meta type" }, "file_path": { "type": "string", "default": "", "required": false, "description": "Directory path to the file" }, "size": { "type": "integer", "default": "", "required": false, "description": "Size in bytes" }, "extension": { "type": "string", "default": "", "required": false, "description": "File extension" }, "date": { "type": "integer", "default": false, "required": false, "description": "File upload date in unixtimestamp" }, "user_id": { "type": "integer", "default": 0, "required": false, "description": "User ID" }, "chat_id": { "type": "integer", "default": 0, "required": false, "description": "Chat ID" }, "online_user_id": { "type": "integer", "default": 0, "required": false, "description": "Online user ID" }, "persistent": { "type": "integer", "default": 0, "required": false, "description": "Is file persistent and should not be removed within files maintenence cronjob." }, "security_hash": { "type": "string", "description": "Image content encoded with base64_encode. It's used to change operator profile photo." } }, "example" : { "upload_name" : "invoice", "chat_id" : 11 } }, "NewChat": { "type": "object", "properties": { "ignore_required": { "type": "boolean", "default": true, "required": false, "description": "Should we apply same required fields validation as starting chat from web interface." }, "ignore_bot": { "type": "boolean", "default": false, "required": false, "description": "Should we ignore bot auto assignment workflow." }, "department": { "type": "array", "default": "name", "required": false, "description": "Department ID's. From what departments list chat is provided. You should include array of departments. Even if it's only one department." }, "invitation_id": { "type": "integer", "default": "name", "required": false, "description": "Proactive invitation ID" }, "theme": { "type": "integer", "default": "", "required": false, "description": "Theme" }, "vid": { "type": "string", "default": "", "required": false, "description": "Online visitor unique hash" }, "fields": { "$ref": "#/definitions/NewChatFields" }, "main_attr": { "$ref": "#/definitions/Chat" }, "messages": { "type": "array", "default": "name", "required": false, "items": { "$ref": "#/definitions/ChatMessage" }, "description": "If you are creating chat and chat existed already in third party system it makes sense to pass also previous messages." }, "chat_variables": { "type": "array", "default": "name", "required": false, "description": "Provide additional chat variables which can be used by extension. E.g [{UUID: \"Some internal value\"}]" }, "additional_data": { "type": "array", "items": { "$ref": "#/definitions/AdditionalItem" }, "default": "name", "required": false, "description": "Stores additional chat variables. These variables are visible by operators and have strict structure." } }, "example" : { "ignore_required" : true, "ignore_bot" : false, "department" : [1], "fields" : { "Question" : "Visitor Initial Message. If you are passing messages argument makes sense just skip this", "Username" : "Visitor nick" }, "chat_variables" : { "UUID" : "Just some internal variable" }, "main_attr" : { "remarks" : "This is main attribute update" }, "additional_data" : [ { "h": true, "identifier": "age", "key": "Age", "value": 18 } ], "messages" : [ { "msg": "Visitor initial message", "time": {{ts}}, "user_id": 0 }, { "msg": "Bot message", "time": {{ts}}, "user_id": -2 }, { "msg": "System message", "time": {{ts}}, "user_id": -1 } ] } }, "NewChatFields": { "type": "object", "properties": { "Question": { "type": "string", "default": "name", "required": false, "description": "User initial message" }, "Username": { "type": "string", "default": "name", "required": false, "description": "Visitor nick" }, "Email": { "type": "string", "default": "name", "required": false, "description": "Visitor E-mail" }, "Phone": { "type": "string", "default": "name", "required": false, "description": "Visitor Phone" }, "AcceptTOS": { "type": "boolean", "default": "name", "required": false, "description": "Accept Terms Of Service" }, "DepartamentID": { "type": "integer", "default": "name", "required": false, "description": "To what department chat should be assigned" }, "priority": { "type": "integer", "default": "name", "required": false, "description": "Priority of chat" }, "URLRefer": { "type": "string", "default": "name", "required": false, "description": "Chat referrer. Page URL or E.g CRM" }, "r": { "type": "string", "default": "name", "required": false, "description": "Current session referer. E.g CRM Finance" }, "bot_id": { "type": "integer", "default": "name", "required": false, "description": "Bot ID to assign to chat. It will override department bot" }, "user_timezone": { "type": "integer", "default": "name", "required": false, "description": "User timezone offset in hours" }, "operator": { "type": "integer", "default": "name", "required": false, "description": "To what operator chat should be assigned directly" } } }, "AdditionalItem": { "type": "object", "properties": { "h": { "type": "boolean", "default": false, "required": false, "description": "Was value passed as hidden" }, "identifier": { "type": "string", "default": "name", "required": false, "description": "This can be used in extension and should be system name without constantly changing value" }, "key": { "type": "string", "default": "name", "required": false, "description": "Operator sees this as passed variable name. Literal name." }, "value": { "type": "string", "default": "name", "required": false, "description": "Value" } } }, "addmsguser": { "type": "object", "properties": { "error": { "type": "boolean", "default": false, "required": false, "description": "Was the an error" }, "r": { "type": "string", "default": "", "required": false, "description": "Holds error message in case of an error" }, "msg" : { "$ref": "#/definitions/ChatMessage" } } }, "ChatMessage": { "type": "object", "properties": { "id": { "type": "integer", "default": null, "required": false, "description": "Message ID" }, "msg": { "type": "string", "default": "name", "required": false, "description": "Message text" }, "meta_msg": { "type": "string", "default": "name", "required": false, "description": "Meta message content. JSON encoded string." }, "time": { "type": "integer", "default": "name", "required": true, "description": "Message time in unix timestamp" }, "chat_id": { "type": "integer", "default": "name", "required": false, "description": "Chat ID" }, "user_id": { "type": "integer", "default": "name", "required": false, "description": "User ID. Message type depends on user id. [0] - Visitor message, [> 0] - Operator Message, [-1] - System message. Not visible by visitor, [-2] Bot message" }, "name_support": { "type": "string", "default": "name", "required": false, "description": "Operator nick" } } }, "MailConversation": { "type": "object", "description": "Main thread attributes. Each mail thread get's it's own conversation. This module is not released and will be released on 2024-01-01", "properties": { "id": { "type": "integer", "default": null, "required": false, "description": "Conversation ID" }, "remarks": { "type": "string", "default": "", "required": false, "description": "Remarks of the conversation" }, "date": { "type": "string", "default": "", "required": false, "description": "DAte format in human readable format. This come from first mail in the thread." }, "from_address": { "type": "string", "default": "", "required": false, "description": "From what e-mail mail was send." }, "from_name": { "type": "string", "default": "", "required": false, "description": "Sender e-mail" }, "body": { "type": "string", "default": "", "required": false, "description": "Mail body in plain text format." }, "subject": { "type": "string", "default": "name", "required": false, "description": "Very first mail subject" }, "mail_variables": { "type": "string", "default": "name", "required": false, "description": "Stores additional covnersation attributes in JSON format. This is used by extensions." }, "transfer_uid": { "type": "integer", "default": "", "required": false, "description": "Stores the user ID who transfered the conversation." },"start_type": { "type": "integer", "default": "", "required": false, "description": "Start type of the conversatin. Indicates who started a mail thread. Was is our send e-mail or received e-mail. const START_IN = 0; const START_OUT = 1;" },"lr_time": { "type": "integer", "default": "name", "required": false, "description": "Stores time last time was responded in this thread by us." },"ctime": { "type": "integer", "default": "", "required": false, "description": "Time when conversation was created." },"user_id": { "type": "integer", "default": "0", "required": false, "description": "Operator ID whom belongs current conversation." },"status": { "type": "integer", "default": "", "required": false, "description": "Status of the conversation. const STATUS_PENDING = 0; const STATUS_ACTIVE = 1; const STATUS_CLOSED = 2;" },"last_message_id": { "type": "integer", "default": "", "required": false, "description": "Stores last mail messages id received in the thread." },"mailbox_id": { "type": "integer", "default": "", "required": false, "description": "Stores mailbox id" },"message_id": { "type": "integer", "default": "", "required": false, "description": "Stores very first message id received in the conversation." },"priority": { "type": "string", "default": "", "required": false, "description": "Stores priority of the conversation. This comes from defined matching rule." },"priority_asc": { "type": "string", "default": "", "required": false, "description": "Reverse value of priority for efficient sorting and database indexes." },"udate": { "type": "integer", "default": "", "required": false, "description": "Time when server created mail covnersation. Unix timestamp." },"total_messages": { "type": "integer", "default": "name", "required": false, "description": "Stores number of total messages in the conversation." },"match_rule_id": { "type": "string", "default": "", "required": false, "description": "Stores ID of matching rule applied" },"cls_time": { "type": "integer", "default": "", "required": false, "description": "Close time of the conversation" },"pnd_time": { "type": "integer", "default": "name", "required": false, "description": "Stores time since conversation become pending." },"wait_time": { "type": "integer", "default": "", "required": false, "description": "Defines how long conversation was in pending state before it was accepted. accept_time - pnd_time" },"accept_time": { "type": "integer", "default": "", "required": false, "description": "Time when conversation was accepted." },"response_time": { "type": "integer", "default": "", "required": false, "description": "How long chat was in active state before it was responded. [lr_time - accept_time]" },"interaction_time": { "type": "integer", "default": "name", "required": false, "description": "Is time between the agent accepting a and closing e-chat. [cls_time - accept_time]" },"tslasign": { "type": "integer", "default": "", "required": false, "description": "Time since last assignment happened." },"conv_duration": { "type": "integer", "default": "name", "required": false, "description": "Conversation duration. It's difference between messages received at and responded at times." },"follow_up_id": { "type": "integer", "default": "name", "required": false, "description": "Previous conversation id. If conversation is closed and can't be reopened. This holds parent conversation id." },"has_attachment": { "type": "integer", "default": "", "required": false, "description": "Holds what type of attachements conversation has. const ATTACHMENT_EMPTY = 0;const ATTACHMENT_INLINE = 1;const ATTACHMENT_FILE = 2;const ATTACHMENT_MIX = 3;" },"undelivered": { "type": "integer", "default": "", "required": false, "description": "Was this an undelivered mail. 0 - no, 1 - yes." },"pending_sync": { "type": "integer", "default": "", "required": false, "description": "If operator sends an e-mail and we are waiting for background process to fetch it." } } }, "MailMessageElastic": { "type": "object", "description": "Additional mail messages attributes in elastic search", "properties": { "id": { "type": "integer", "default": null, "required": false, "description": "Mail message ID" }, "body": { "type": "string", "default": null, "required": false, "description": "HTML body after strip_tags applies" }, "to_data": { "type": "string", "default": null, "required": false, "description": "covnerted to keywords" }, "reply_to_data": { "type": "string", "default": null, "required": false, "description": "covnerted to keywords" }, "cc_data": { "type": "string", "default": null, "required": false, "description": "covnerted to keywords" }, "bcc_data": { "type": "string", "default": null, "required": false, "description": "covnerted to keywords" }, "cls_time": { "type": "integer", "default": null, "required": false, "description": "unix timestam in elastic search format unixtimestamp * 1000" },"accept_time": { "type": "integer", "default": null, "required": false, "description": "unix timestam in elastic search format unixtimestamp * 1000" },"lr_time": { "type": "integer", "default": null, "required": false, "description": "unix timestam in elastic search format unixtimestamp * 1000" },"delivery_status": { "type": "string", "default": null, "required": false, "description": "covnerted to keywords" },"conv_user_id": { "type": "integer", "default": null, "required": false, "description": "Covnersation user ID" }, "status_conv": { "type": "integer", "default": null, "required": false, "description": "Covnersation status attribute" },"start_type": { "type": "integer", "default": null, "required": false, "description": "Covnersation start_type attribute" },"mail_variables": { "type": "integer", "default": null, "required": false, "description": "Covnersation mail_variables attribute" },"follow_up_id": { "type": "integer", "default": null, "required": false, "description": "Covnersation follow_up_id attribute" },"subject_id": { "type": "array", "default": null, "example": [0,1], "required": false, "description": "array of assigned subjects. Array of integers" },"hour": { "type": "integer", "default": null, "example": 12, "required": false, "description": "Hour in UTC timezome message was received" }{{append_elastic_mail_definitions}} } }, "MailMessage": { "type": "object", "description": "Mail message attributes. Each mail thread get's it's own conversation. This module is not released and will be released on 2024-01-01", "properties": { "id": { "type": "integer", "default": null, "required": false, "description": "Mail message ID" }, "status": { "type": "integer", "default": "", "required": false, "description": "Status of the mail message. const STATUS_PENDING = 0; const STATUS_ACTIVE = 1;const STATUS_RESPONDED = 2;" }, "conversation_id": { "type": "integer", "default": "", "required": false, "description": "To what conversation/thread this mail message belongs to." }, "message_id": { "type": "string", "default": "", "example": "<CAFs-aWEdgF80YUrkVtR5Pkq4r4T15qowxQYj4xX4dmpZiWtgpw@mail.gmail.com>", "required": false, "description": "Message id from the sever." }, "in_reply_to": { "type": "string", "default": "", "example": "<CAFs-aWEdgF80YUrkVtR5Pkq4r4T15qowxQYj4xX4dmpZiWtgpw@mail.gmail.com>", "required": false, "description": "Stores to what message it was a reply." }, "subject": { "type": "string", "default": "", "required": false, "description": "Subject of the message" }, "body": { "type": "string", "default": "", "required": false, "description": "HTML Body" }, "alt_body": { "type": "string", "default": "", "required": false, "description": "Plain body in text" }, "references": { "type": "string", "default": "", "example": "<CAFs-aWH2-AgghVndxHW7n+oM_m2mOb6cnKgqBtUUNcHFKgJQ1A@mail.gmail.com> <hZWUY8EYQEKfllEVLSUNKWyiI7pygH8fVLEp0A3nXfQ@devmysql.livehelperchat.com>", "required": false, "description": "To what mail message this particular message is related to." },"ctime": { "type": "integer", "default": "", "required": false, "description": "Time when message was created on our server in unix timestamp format." },"udate": { "type": "integer", "default": "", "required": false, "description": "Message original received time on the mail server in unix timestamp format." },"date": { "type": "string", "default": "", "required": false, "description": "Time in human readable format." },"flagged": { "type": "integer", "default": "0", "required": false, "description": "Mail message original attribute." },"recent": { "type": "integer", "default": "", "required": false, "description": "Mail message original attribute." },"msgno": { "type": "integer", "default": "", "required": false, "description": "Messages number attribute from the IMAP server." },"uid": { "type": "integer", "default": "", "required": false, "description": "Unique message ID from the mail server." },"size": { "type": "integer", "default": "", "required": false, "description": "Mail size in bytes." },"from_host": { "type": "string", "default": "", "example": "gmail.com", "required": false, "description": "From what host mail received." },"from_name": { "type": "string", "default": "", "example": "Remigijus Kiminas", "required": false, "description": "From what name mail received" },"from_address": { "type": "string", "default": "", "example": "info@livehelperchat.com", "required": false, "description": "From what e-mail mail received." },"sender_host": { "type": "string", "default": "", "required": false, "description": "From what host e-mail was send." },"sender_name": { "type": "string", "default": "", "required": false, "description": "Snder name. Most of the time it matches from_name" },"sender_address": { "type": "string", "default": "", "example": "remdex@gmail.com", "required": false, "description": "Sender address." },"to_data": { "type": "string", "default": "", "example": "{\"info@livehelperchat.com\":\"Live Helper Chat\"}", "required": false, "description": "Stores to whom this mail message was send. JSON format" },"reply_to_data": { "type": "string", "default": "", "example": "{\"info@livehelperchat.com\":\"Live Helper Chat\"}", "required": false, "description": "To whom this mail message should be replied to. JSON format" },"mailbox_id": { "type": "integer", "default": "", "required": false, "description": "To what mailbox this message belongs to." }, "response_time": { "type": "integer", "default": "", "required": false, "description": "How long chat was in accepted state before it was responded. [lr_time - accept_time];" }, "cls_time": { "type": "integer", "default": "name", "required": false, "description": "Time conversation was closed." }, "wait_time": { "type": "integer", "default": "", "required": false, "description": "how long chat was in pending before it was accepted. [pnd_time - accept_time]" }, "accept_time": { "type": "integer", "default": "name", "required": false, "description": "Time when chat was accepted. During sync our send messages get's accept_time as soon they were received. Accept time is the one operator opens in or clicks reply" },"interaction_time": { "type": "integer", "default": "name", "required": false, "description": "Is time between the agent accepting a and closing e-chat." },"user_id": { "type": "integer", "default": "", "required": false, "description": "Operator ID" },"lr_time": { "type": "integer", "default": "", "required": false, "description": "Time when we send a response to the message." }, "response_type": { "type": "integer", "default": "", "required": false, "description": "const RESPONSE_UNRESPONDED = 0;// Normal response by sending mail back. const RESPONSE_NOT_REQUIRED = 1; // Visitor just send thank you message. const RESPONSE_INTERNAL = 2; // We have send this message as reply or forward const RESPONSE_NORMAL = 3; // To this message was responded by us." },"bcc_data": { "type": "string", "default": "", "example": "{\"info@livehelperchat.com\":\"Live Helper Chat\"}", "required": false, "description": "BCC Data in json format." },"cc_data": { "type": "string", "default": "", "example": "{\"info@livehelperchat.com\":\"Live Helper Chat\"}", "required": false, "description": "If operator sends an e-mail and we are waiting for background process to fetch it." },"dep_id": { "type": "integer", "default": "", "required": false, "description": "Department ID" },"mb_folder": { "type": "string", "default": "", "example": "{mail.livehelperchat.com:993/imap/ssl}Sent", "required": false, "description": "From what mailbox this mail message was imported." },"conv_duration": { "type": "integer", "default": "", "required": false, "description": "// How long visitor had to wait for an answer // Raw time un-till response was send [time() - $mail->ctime];" },"has_attachment": { "type": "integer", "default": "", "required": false, "description": "Mail message attatchements indication. const ATTACHMENT_EMPTY = 0;const ATTACHMENT_INLINE = 1;const ATTACHMENT_FILE = 2;const ATTACHMENT_MIX = 3;" },"rfc822_body": { "type": "string", "default": "", "required": false, "description": "If mail was undelivered this holds undelivered message body." },"delivery_status": { "type": "string", "default": "", "required": false, "description": "Stores delivery status in JSON format." },"undelivered": { "type": "integer", "default": "", "required": false, "description": "Was this message undelivered." },"priority": { "type": "integer", "default": "", "required": false, "description": "Priority from matching rule." } } }, "Department": { "type": "object", "properties": { "raw_attr": { "type": "boolean", "nullable": true, "example": true, "description": "If you pass true we will use payload data directly as department attributes. Usefull if you want just to modify department data without any validation." }, "Name": { "type": "string", "default": "Name", "example" : "Department name", "required": true, "description": "Name of the department" }, "Email": { "type": "string", "format": "email", "nullable": true, "required": false, "example": null, "description": "E-mail" }, "XMPPRecipients": { "type": "string", "nullable": true, "example": null }, "XMPPRecipientsGroup": { "type": "string", "nullable": true, "example": null }, "Identifier": { "type": "string", "nullable": true, "example": null }, "Priority": { "type": "integer", "nullable": true, "example": 0 }, "SortPriority": { "type": "integer", "nullable": true, "example": null }, "TansferDepartmentID": { "type": "integer", "nullable": true, "example": null, "min" : 1 }, "TransferTimeout": { "type": "integer", "nullable": true, "example": null, "min" : 5 }, "delay_lm": { "type": "integer", "nullable": true, "example": null, "min" : 5 }, "OnlineHoursActive": { "type": "boolean", "nullable": true, "example": true }, "Disabled": { "type": "boolean", "nullable": true, "example": false }, "Hidden": { "type": "boolean", "nullable": true, "example": false }, "inform_close": { "type": "boolean", "nullable": true, "example": false }, "inform_unread": { "type": "boolean", "nullable": true, "example": false }, "nc_cb_execute": { "type": "boolean", "nullable": true, "example": false }, "archive": { "type": "boolean", "nullable": true, "example": false }, "AutoAssignActive": { "type": "boolean", "nullable": true, "example": false }, "VisibleIfOnline": { "type": "boolean", "nullable": true, "example": false }, "ExcludeInactiveChats": { "type": "boolean", "nullable": true, "example": false }, "MaxNumberActiveChats": { "type": "integer", "nullable": true, "example": 0 }, "MaxWaitTimeoutSeconds": { "type": "integer", "nullable": true, "example": 0 }, "MaxNumberActiveDepChats": { "type": "integer", "nullable": true, "example": 0 }, "pending_max": { "type": "integer", "nullable": true, "example": 0 }, "delay_before_assign": { "type": "integer", "nullable": true, "example": 0 }, "inform_unread_delay": { "type": "integer", "nullable": true, "example": 0, "min": 5 }, "inform_delay": { "type": "integer", "nullable": true, "example": 0, "min": 0 }, "inform_close_all": { "type": "boolean", "nullable": true, "example": false }, "inform_close_all_email": { "type": "string", "nullable": true, "example": "" }, "products_enabled": { "type": "boolean", "nullable": true, "example": false }, "products_required": { "type": "boolean", "nullable": true, "example": false }, "assign_same_language": { "type": "boolean", "nullable": true, "example": false }, "hide_send_email": { "type": "boolean", "nullable": true, "example": false }, "bot_only_offline": { "type": "boolean", "nullable": true, "example": false }, "auto_delay_timeout": { "type": "integer", "nullable": true, "example": null, "min" : 1 }, "auto_delay_var": { "type": "string", "nullable": true, "example": null, "min" : 1 }, "survey_id": { "type": "integer", "nullable": true, "example": null, "min" : 1 }, "bot_id": { "type": "integer", "nullable": true, "example": null, "min" : 1 }, "bot_tr_id": { "type": "integer", "nullable": true, "example": null, "min" : 1 }, "attr_int_1": { "type": "integer", "nullable": true, "example": null }, "attr_int_2": { "type": "integer", "nullable": true, "example": null }, "attr_int_3": { "type": "integer", "nullable": true, "example": null } }, "example" : { "Name" : "Name of department" } } }, "externalDocs": { "description": "Find out more about Live Helper Chat", "url": "https://livehelperchat.com" } }
| ver. 1.4 |
Github
|
.
| PHP 8.2.30 | ���֧ߧ֧�ѧ�ڧ� ����ѧߧڧ��: 0 |
proxy
|
phpinfo
|
���ѧ����ۧܧ�