logo

How to Wait for API Responses Asynchronously

When your application calls a slow external API — payment processing, AI inference, video conversion — you have two choices: block your server while waiting, or offload the work to a task queue.

This guide shows you how to use AsyncQueue to fire-and-forget API calls and retrieve the result when it’s ready.

The Problem

// This blocks your server for 30+ seconds
app.post('/convert-video', async (req, res) => {
  const result = await fetch('https://slow-api.example.com/convert', {
    method: 'POST',
    body: JSON.stringify({ videoUrl: req.body.url }),
  });
  const data = await result.json();
  res.json(data); // User waited 30 seconds for this
});

On serverless platforms, the function might timeout before the response even arrives.

The Solution: Offload to AsyncQueue

Step 1: Create an AsyncQueue account and get your API key

Sign up at asyncqueue.io and generate an API key from the dashboard. Store it as an environment variable.

ASYNCQUEUE_API_KEY=your_api_key_here

Step 2: Install the AsyncQueue SDK

# Node.js
npm install asyncqueue-js

# Python
pip install asyncqueue-python

Step 3: Create a task with a callback URL

Instead of calling the slow API directly, create an AsyncQueue task that handles the call:

import { AsyncQueue } from 'asyncqueue-js';

const aq = new AsyncQueue({ apiKey: process.env.ASYNCQUEUE_API_KEY });

app.post('/convert-video', async (req, res) => {
  const task = await aq.tasks.create({
    callbackUrl: 'https://slow-api.example.com/convert',
    payload: { videoUrl: req.body.url },
    retries: 3,
    webhookUrl: 'https://your-app.com/api/on-convert-complete',
  });

  // Respond immediately with the task ID
  res.json({ taskId: task.id, status: 'processing' });
});

Your endpoint now responds in milliseconds rather than 30+ seconds.

Step 4: Handle the callback response

Create an endpoint that AsyncQueue calls via webhook when the external API finishes:

app.post('/api/on-convert-complete', async (req, res) => {
  const { taskId, result, status } = req.body;

  // Save the result, notify the user, update the UI
  await saveConversionResult(taskId, result);
  await notifyUser(taskId, 'Your video is ready!');

  res.json({ received: true });
});

Step 5: Query the task result via API

You can also check task status programmatically:

const task = await aq.tasks.get('task_abc123');

console.log(task.status);  // 'completed'
console.log(task.result);  // { convertedUrl: 'https://...' }

The AsyncQueue dashboard also provides a visual overview of all your tasks.

When to Use This Pattern

  • Payment processing: Charge a card and wait for confirmation
  • AI/ML inference: Send data to an AI model and get results later
  • File processing: Convert, compress, or analyze uploaded files
  • Third-party integrations: Sync data with slow external services
  • Email delivery: Send emails through providers with slow APIs