Frequently Asked Questions

Find answers to the most common questions about Gomobile.


Authentication & Access

chevron-rightHow do I get an API key?hashtag

API keys are provisioned by the Gomobile team to ensure security and proper access control.

To request an API key:

  1. Fill in your details and use case

  2. Our team will review and provision your key within 24 hours

  3. You'll receive your API key via secure email

Once you receive your key, store it securely and use it in the Authorization header:

Authorization: Bearer YOUR_API_KEY
chevron-rightWhat authentication method does Gomobile use?hashtag

Gomobile uses API key-based authentication. Your API key is a long-lived credential that you include in every request:

Authorization: Bearer YOUR_API_KEY
Feature
API Key

Lifespan

Long-lived

Obtained via

Request from Gomobile team

Refresh needed

No

Best for

All API integrations

API keys are provisioned by our team. Request your API keyarrow-up-right to get started.

chevron-rightMy API key stopped working. What happened?hashtag

Common reasons:

  1. Expired - Your key may have an expiration date

  2. Revoked - The key may have been revoked for security reasons

  3. Wrong format - Ensure you're using Authorization: Bearer <your-key>

  4. Typo - Double-check you're using the correct key

To resolve: Contact our support teamarrow-up-right and we'll help you verify your key status or provision a new one.

chevron-rightCan I have multiple API keys?hashtag

Yes! You can have multiple API keys for different purposes:

  • Per environment: Separate keys for development, staging, and production

  • Per integration: One key per third-party service

  • Per team member: Individual keys for accountability

To request additional API keys, contact our teamarrow-up-right with your use case.

chevron-rightHow do I rotate my API key safely?hashtag

Follow this sequence to avoid downtime:

  1. Request a new key - Contact our teamarrow-up-right to provision a new API key

  2. Receive your new key - We'll send it via secure email

  3. Update your applications - Deploy the new key to your systems

  4. Test - Verify everything works with the new key

  5. Notify us - Let us know to revoke the old key


Contacts & Audiences

chevron-rightWhat's the difference between a contact and an audience?hashtag
Concept
Description

Contact

An individual person with a phone number and optional details (name, email, address, custom attributes)

Audience

A named group of contacts that can be targeted by a program

Think of contacts as rows in a database, and audiences as saved filters or segments. One contact can belong to multiple audiences.

chevron-rightCan a contact be in multiple audiences?hashtag

Yes! Contacts can belong to any number of audiences simultaneously. Add contacts to an audience using:

chevron-rightWhat phone number formats are accepted?hashtag

Phone numbers must be 3-20 characters. We recommend E.164 format:

Examples:

  • +212612345678 (Morocco)

  • +14155551234 (USA)

  • 06-12-34-56-78 (spaces/dashes)

  • 0612345678 (missing country code)

chevron-rightHow do I import contacts in bulk?hashtag

Use the upsert endpoint to import multiple contacts at once:

Existing contacts (matched by phone number) are updated; new contacts are created.

chevron-rightCan I add custom fields to contacts?hashtag

Yes! First, define a custom attribute for your organization:

Then include it when creating/updating contacts:

chevron-rightHow do I remove a contact from all campaigns?hashtag

Two options:

  1. Soft delete the contact: DELETE /contact/:id - Contact is marked as deleted but data is retained

  2. Remove from specific audiences: Manage audience membership individually

Note: Deleting a contact doesn't cancel in-progress calls to that contact.

chevron-rightWhat happens to contacts when I delete an audience?hashtag

Contacts are NOT deleted. Only the audience grouping is removed. Contacts remain in your organization and can be added to other audiences.


Flows & Nodes

chevron-rightWhat's the difference between a flow and a program?hashtag
Concept
Purpose

Flow

Defines what happens during a call - the logic, audio, inputs, branching

Program

Defines when, who, and how - audience, schedule, retry strategy, pause windows

A flow is like a script; a program is like a scheduled performance of that script to a specific audience.

chevron-rightCan I reuse flows across multiple programs?hashtag

Yes! Flows are templates that can be used by many programs. Create the flow once, then reference its flowId in different programs targeting different audiences or schedules.

chevron-rightWhat happens if a flow has an error during execution?hashtag

Each node has an onError output you can configure. If an error occurs:

  1. The flow follows the onError path if defined

  2. Otherwise, it follows the default output if defined

  3. If neither exists, the call is terminated with outcome failed

The error details are captured in the call report's flowExecution.executionPath.

chevron-rightHow do I test a flow before launching?hashtag

Use the validate endpoint to check your flow without saving:

Response:

You can also execute a single test call using POST /flows/execute with a test contact.

chevron-rightWhat node types are available?hashtag
Node
Purpose
Key Outputs

Dial

Places outbound call

onAnswer, onVoicemail, onNoAnswer, onBusy, onRejected, onError

Answer

Answers inbound call

onSuccess, onError

Play

Plays audio

onComplete, onError

DTMF

Collects keypad input

branches (by digit), onSuccess, onTimeout, onInvalid, onMaxRetries

Record

Records voice

onComplete, onTimeout, onError

Condition

Branches on logic

onTrue, onFalse, onError

Set Variable

Stores a value

onSuccess, onError

Hangup

Ends the call

None (terminal)

chevron-rightCan I branch logic based on caller input?hashtag

Yes! Use the DTMF node with branches:

chevron-rightHow do I play dynamic content (name, amount)?hashtag

Use ValueSource references in your Play node:

Sources available: variable, customAttribute, contactField.


Calls & Execution

chevron-rightWhy didn't my call go through?hashtag

Check the call report (GET /call-report/:jobId) for the outcome field:

Outcome
Meaning

no_answer

Recipient didn't pick up (timeout reached)

busy

Line was busy

rejected

Recipient declined the call

failed

System error (check outcomeReason)

cancelled

Call was cancelled before completion

Also verify:

  • Phone number format is correct

  • DID pool has valid numbers

  • Program status is active

chevron-rightWhat does "AMD" mean?hashtag

AMD = Answering Machine Detection

When enabled (enableAMD: true) on a Dial node, the system detects whether a human or voicemail answered:

  • Human detected → Routes to onAnswer

  • Machine detected → Routes to onVoicemail

This lets you play different messages or skip voicemails entirely.

chevron-rightHow long does a call attempt last?hashtag

The dial timeout determines how long to wait for an answer. Default is 30 seconds (30000ms).

Configure it in your Dial node:

chevron-rightCan I schedule calls for a specific time?hashtag

Yes! Set startAt when creating a program:

The program won't start calling until the scheduled time.

chevron-rightHow do I stop a running campaign?hashtag

Two options:

  1. Pause (can resume later):

  2. Cancel (permanent):

Note: Already-queued calls will complete; only pending contacts are affected.

chevron-rightWhat happens to pending calls when I pause a program?hashtag
  • In-progress calls: Continue until they complete

  • Queued calls: Will finish processing

  • Pending contacts: Wait until you resume with PATCH /program-executions/:id/resume

The execution status changes to paused and no new contacts are pulled until resumed.

chevron-rightCan I call the same contact multiple times?hashtag

Yes, through retry strategies. If a call fails (no answer, busy, etc.), the system can automatically retry based on your configuration:

  • fixed_delay: Retry after X minutes

  • scheduled: Retry at specific times

See the Retry Strategies section below.


Retry Strategies

chevron-rightHow many times will Gomobile retry a failed call?hashtag

It depends on your retry strategy:

  • none: No retries (1 attempt total)

  • fixed_delay: Up to maxRetries additional attempts

  • scheduled: Number of dates in retryDates array

Example with 3 retries (4 total attempts):

chevron-rightWhat triggers a retry?hashtag

Retries are triggered when a call doesn't reach a successful outcome:

  • completed - No retry (success)

  • 🔄 no_answer - Retry

  • 🔄 busy - Retry

  • 🔄 rejected - Retry

  • 🔄 voicemail - Retry (configurable)

  • failed - Retry (system error)

chevron-rightHow long between retries?hashtag

For fixed_delay strategy, set delayMinutes:

For scheduled strategy, specify exact times:

chevron-rightCan I retry at specific times?hashtag

Yes! Use the scheduled retry strategy:

Each date is an ISO 8601 timestamp for when the retry should occur.

chevron-rightDo retries respect pause windows?hashtag

Yes. If a retry is scheduled during a pause window, it waits until the pause window ends before attempting the call.


Pause Windows & Scheduling

chevron-rightWhat's a pause window?hashtag

A pause window is a time range when calls should NOT be made. Use them for:

  • Lunch breaks

  • Outside business hours

  • Holidays

  • Weekends

During a pause window, the system stops pulling new contacts. Already-queued calls complete, but no new calls start.

chevron-rightCan I set different pause windows per day?hashtag

Yes! Configure each weekday separately:

chevron-rightDo pause windows apply to all timezones?hashtag

Pause windows use the program's timezone setting. If you're calling across multiple timezones, consider:

  • Setting windows based on recipient timezones (segment by region)

  • Using broader windows to cover multiple zones

chevron-rightWhat happens to a call during pause window?hashtag
  • New contacts: Not pulled from the queue until pause ends

  • In-progress calls: Complete normally

  • Retries: Postponed until after the pause window

chevron-rightCan I add holidays as pause days?hashtag

Yes! Use advanced pause windows for specific dates:


Audio & Media

chevron-rightWhat audio formats are supported?hashtag

Upload audio files via POST /audio-management/upload using multipart/form-data. The system processes and converts files automatically.

Supported content types include:

  • audio/wav

  • audio/mp3

  • audio/mpeg

Audio is processed to telephony-optimized format (8kHz sample rate, mono).

chevron-rightHow do I upload audio files?hashtag

Response includes the id to use in your Play nodes.

chevron-rightCan I use text-to-speech?hashtag

Yes! The Play node supports dynamic content types:

  • audioFile: Pre-recorded audio

  • number: Spoken numbers (e.g., account balance)

  • date: Spoken dates

  • word: Dictionary words

Configure language (ar or fr) and mode for each item.

chevron-rightWhat's a dictionary used for?hashtag

Dictionaries map keys to audio files for dynamic content. For example, a "Numbers" dictionary might have:

  • Key "1" → audio of "one" spoken

  • Key "100" → audio of "one hundred" spoken

  • Key "thousand" → audio of "thousand" spoken

Use dictionaries in Play nodes to dynamically construct spoken content like amounts or dates.

chevron-rightHow do I update an audio file?hashtag

To update metadata (title, description, tags):

To replace the audio content, upload a new file and update your flows to reference the new audio ID.


Reporting & Analytics

chevron-rightHow do I see call results?hashtag

Use the Call Report API:

This returns:

  • Job status (queued, active, completed, failed)

  • All attempts with outcomes

  • Flow execution path (which nodes ran)

  • Event timeline (dial, answer, play, hangup, etc.)

chevron-rightWhat statuses can a call have?hashtag
Status
Description

completed

Call answered and flow completed successfully

no_answer

Recipient didn't answer (timeout)

busy

Line was busy

rejected

Recipient declined the call

voicemail

Answering machine detected

failed

System error during call

cancelled

Call was cancelled

user_hangup

Recipient hung up during the call

chevron-rightCan I export call reports?hashtag

Yes, the API returns JSON data that you can process and export. Query individual reports with GET /call-report/:jobId or build custom exports using the data.

chevron-rightHow long is call data retained?hashtag

Call report data is persisted in the database and available even after background jobs are cleaned up. Retention periods depend on your organization's plan and settings.

chevron-rightCan I see which flow node caused a failure?hashtag

Yes! The call report includes flowExecution.executionPath:

The outputPath shows which branch was taken, including error paths.


Troubleshooting

chevron-rightI'm getting 401 Unauthorizedhashtag

Causes:

  • API key expired or revoked

  • Missing or malformed Authorization header

  • Typo in your API key

Solutions:

  1. Check header format: Authorization: Bearer YOUR_API_KEY

  2. Verify you're using the correct API key

  3. Contact our teamarrow-up-right if you need a new API key

chevron-rightI'm getting 429 Too Many Requestshashtag

You've hit the rate limit. Solutions:

  1. Reduce request frequency - Add delays between calls

  2. Implement exponential backoff - Wait longer after each retry

  3. Batch operations - Use bulk endpoints like /contact/upsert

  4. Check response headers for rate limit details

chevron-rightCalls show "error" but no detailshashtag

Check the call report for more information:

Look at:

  • outcomeReason for error description

  • flowExecution.executionPath for which node failed

  • events array for detailed timeline

Common causes: invalid audio file, misconfigured flow, missing node outputs.

chevron-rightMy program won't starthashtag

Verify:

  1. startAt is in the future - Or already passed if you want immediate start

  2. Audience is not empty - AudienceEmptyError if no contacts

  3. No existing running execution - ExecutionAlreadyRunningError

  4. Program status is active - Not draft or archived

Launch with: POST /programs/:id/launch

chevron-rightContacts aren't receiving callshashtag

Check:

  1. Phone format - Must be 3-20 characters, preferably E.164

  2. Audience membership - Contact must be in the program's audience

  3. Pause windows - Calls might be paused

  4. Execution status - Must be running, not paused or stopped

  5. DID pool - Program must have valid caller IDs

chevron-rightFlow execution stops unexpectedlyhashtag

Common causes:

  1. Missing output connections - Node has no path for the outcome that occurred

  2. No default fallback - Add default outputs as safety nets

  3. Invalid variable reference - Trying to read undefined variable

  4. Audio file not found - Invalid audioId in Play node

Use POST /flows/validate to catch issues before launching.


Best Practices

chevron-rightHow many contacts can I call at once?hashtag

This depends on:

  • Your organization's concurrency limits

  • DID pool size (more numbers = more parallel calls)

  • System capacity

Start with smaller audiences and scale up. Monitor execution progress with GET /program-executions/:id to see contactsInProgress.

chevron-rightWhat's the ideal call window?hashtag

General guidelines:

  • Business hours: 9 AM - 6 PM local time

  • Avoid: Early morning, late evening, meal times

  • Best days: Tuesday - Thursday typically have highest answer rates

Use pause windows to block unsuitable times:

chevron-rightHow do I avoid being marked as spam?hashtag
  1. Use verified caller IDs - Legitimate DIDs with proper registration

  2. Respect do-not-call lists - Remove contacts who opt out

  3. Limit call frequency - Don't call the same person repeatedly in short periods

  4. Call during appropriate hours - Use pause windows

  5. Provide opt-out - Include a DTMF option to stop receiving calls

  6. Identify yourself - Play a clear greeting identifying your organization

chevron-rightShould I use API keys or JWT in production?hashtag

Use API keys for:

  • Server-to-server communication

  • Background jobs and automation

  • CI/CD pipelines

  • Scheduled tasks

Use JWT tokens for:

  • User-facing applications

  • Dashboard/admin interfaces

  • Mobile apps

  • Any context where a user is logged in

API keys are simpler for automation since they don't require refresh logic.


Still have questions?

If you couldn't find the answer you're looking for:

Last updated