Function Template (API Call)

This is a template you can use to create a function that uses an API call. It uses the Zendesk create ticket API as an example.
Created By
Daniel D'Souza
Voiceflow Built
INPUT VARIABLES
{
customerEmail
}
Customer email
{
subject
}
Subject of the ticket
{
body
}
Details of the ticket
{
ZDAPIKey
}
Base64 Encoded Zendesk authentication token
{
customerName
}
Customers name
{
}
OUTPUT VARIABLES
{
ID
}
Ticket ID received from the API response
{
}
{
}
{
}
{
customerName
}
{
}
PATHS
{
success
}
If the API call is successful
{
error
}
Error path
{
}
{
}
{
}
{
}

Function Code Snippet

 
 
 export default async function main(args) {
  const { ZDAPIKey, body, subject, customerEmail, customerName  } = args.inputVars; //This is where you map the input variables you are importing

//Check if the user has inputted the required variables
  if (!ZDAPIKey || !customerEmail || !body ) {
    return {
      //Returns the error path so we can continue the design
      next: { path: 'error' }, 
      //Renders a debug message in Voiceflow
      trace: [{ type: "debug", payload: { message: "Missing required input variables for this function" } }] 
    };
  }

//This creates and stringifys the body for our fetch request
  const data = JSON.stringify({
  "ticket": {
    "comment": {
      "body": body
    },
    "subject": subject,
    "requester": { "name": customerName, "email": customerEmail }
    }
  });

//This defines the URL for our fetch request
  const url = 'https://example.zendesk.com/api/v2/tickets'

//This packages the rest of the information for the fetch request for an example API call to Zendesk
  const config = {
    method: 'POST',
    headers: {
  	'Content-Type': 'application/json',
  	'Authorization': `Basic ${ZDAPIKey}`, // Base64 encoded "username/token:apitoken"
    },
    body : data,
    };


//This is where we made the fetch request, we use try-catch for error handling
  try {
    
    //Make the fetch request
    const response = await fetch(url, config); 

    // Check if the response status is OK (status in the range 200-299)
    if (!response.ok) {
    // If not OK, throw an error to be caught by the catch block
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    
    //Map the fetch request response
    const responseBody = response.json; //IMPORTANT: functions uses .json instead of .json() - see documentation for details
    
    //Checks if the fetch request returned a body
    if (!responseBody || typeof responseBody !== 'object') {
    //If no body was returned, throw an error
      throw new Error(`Invalid or missing response body from the API`);
    }

    //Map a value from the responseBody, we will use this as an output variable
    const TicketID = responseBody.ticket.id 

    // Create the return objects if this is successfull
    return {
      //Map our output variables
      outputVars: { ID: TicketID },
      //Map the success path so we can continue in our flow
      next: { path: 'success' },
      //Render a text step that shows the ticket ID and displays a success emssage
      trace: [{ type: "text", payload: { message: `Ticket Successfully Created with ID ${TicketID}` }}]
    };
  }
  
//Catches all the errors we threw and displays the debug message
catch (error) {
    return {
      //Maps the error path so we can continue in our design
      next: { path: 'error' },
      //Renders a debug message in Voiceflow with the error
      trace: [{ type: "debug", payload: { message: "Error:" + error.message } }]
    };
  }
}
 
 

Function Walkthrough