Add-ons

Add-ons extend a subscription's capabilities beyond the base plan. They provide additional allowances for data, voice, or SMS, purchased as one-time top-ups applied to a subscription.

With coverage profiles and flexible validity, add-ons can be both location-aware and time-aware, enabling use cases like destination-specific travel passes and time-limited data boosters.

Key Concepts

  • Add-on: A purchasable extension that grants additional allowances to a subscription.
  • Top-up: An add-on with type: topUp, used for one-time allowance increases. This is the only supported add-on type.
  • Subscription Add-on: An add-on attached to a specific subscription for a user.
  • Coverage Profile: Defines the geographic region where an add-on can be used. When null, the add-on inherits coverage from the base plan.
  • Validity: Defines how long an add-on lasts, independently of the subscription period.

Allowances

Add-ons can include any combination of data, voice, and SMS allowances:

AllowanceFieldUnitExample
DatadataBytesBytes1000000000 (1 GB)
VoicevoiceSecondsSeconds3600 (60 minutes)
SMSsmsMessagesMessages100

Set any field to null to indicate unlimited allowance of that type.

Example add-on with mixed allowances

{
  "object": "addon",
  "id": "add_0SNlurA049MEWV4VxLfwJc7PJtHc",
  "name": "Roaming Add-On",
  "type": "topUp",
  "allowances": {
    "dataBytes": 1000000000,
    "voiceSeconds": 0,
    "smsMessages": 100
  },
  "price": {
    "amount": 999,
    "currency": "USD"
  }
}

Coverage Profiles

Add-ons can define their own geographic coverage using a coverage profile. This enables travel and roaming use cases where an add-on covers a different region than the base plan.

The coverage object follows the same schema used by Plans:

Add-on with coverage profile

{
  "object": "addon",
  "id": "add_0SNlurA049MEWV3V0q7gjQbM4EVo",
  "name": "1GB Europe Week Pass",
  "type": "topUp",
  "coverage": {
    "object": "coverage",
    "id": "cp_europe_zone_1",
    "countries": ["DE", "FR", "IT", "ES", "PL", "NL"],
    "name": "Europe Zone 1"
  },
  "validity": {
    "unit": "day",
    "value": 7
  },
  "allowances": {
    "dataBytes": 1000000000,
    "voiceSeconds": null,
    "smsMessages": null
  },
  "price": {
    "amount": 499,
    "currency": "USD"
  }
}

When coverage is set to null, the add-on inherits the coverage from the subscription's base plan. This is useful for simple top-ups where the user just needs more data in the same region their plan already covers.

Filtering Add-ons by Country

Use the coverageCountry query parameter to find add-ons that include a specific country in their coverage. This accepts ISO 3166-1 alpha-2 country codes.

Filter add-ons by coverage country

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/addons?coverageCountry=JP" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

The response will include both country-specific add-ons (e.g., "Japan 5GB") and regional add-ons that include the specified country (e.g., "Asia Pacific 10GB").

Activation Triggers

The activationTrigger field controls when an add-on becomes active after being attached to a subscription:

TriggerBehaviourBest For
creationActivates immediately when attached to a subscriptionUsers needing data right now
networkLatchActivates when the device connects to the networkPre-trip purchases where the user has not yet arrived
usageStartedActivates on first usage (data, voice, or SMS)Pre-trip purchases to avoid losing validity days before arrival

Validity and Independent Periods

Add-ons can have their own validity period that is independent from the subscription period. This means an add-on can have a shorter or longer lifespan than the subscription billing cycle.

Example validity configuration

{
  "validity": {
    "unit": "day",
    "value": 7
  }
}

Common validity configurations for travel products:

Product TypeUnitValueExample
Daily boosterday1Quick data for a layover
Weekly passday7Short holiday trip
Monthly planday30Extended travel or relocation

When validity is null, the add-on duration is tied to the subscription period, ending when the subscription period ends.

The add-on validity period begins based on the configured activationTrigger, not the purchase date. For example, if a user purchases a 7-day add-on with usageStarted activation before their trip, the 7-day countdown begins when they first use data at their destination, not when they made the purchase.

Recurrence Types

Add-ons support a single recurrence type: oneTime. Each add-on is a one-time purchase applied to the subscription. There is no recurring add-on type at this time.

Add-on Lifecycle

Add-ons progress through three statuses during their lifecycle:

StatusDescription
draftThe add-on is being configured and is not yet available for purchase.
availableThe add-on is active and can be attached to subscriptions.
archivedThe add-on is no longer available for new purchases but remains active on existing subscriptions.

Managing Add-ons

List all add-ons

Retrieve all add-ons configured for your project:

List add-ons

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/addons" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

You can filter the list using query parameters:

ParameterDescriptionExample
coverageCountryFilter by country in coverage?coverageCountry=JP
statusFilter by add-on status?status=available
typeFilter by add-on type?type=topUp
planFilter by compatible plan?plan=pln_abc123
providerFilter by network provider?provider=p15

Retrieve an add-on

Get details for a specific add-on:

Retrieve an add-on

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/addons/${ADDON_ID}" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

Publish an add-on

Move an add-on from draft to available status:

Publish an add-on

curl --request "POST" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/addons/${ADDON_ID}/publish" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

Archive an add-on

Move an add-on to archived status:

Archive an add-on

curl --request "POST" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/addons/${ADDON_ID}/archive" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

Subscription Add-ons

Once you have add-ons configured, you can attach them to user subscriptions.

Attach an add-on to a subscription

Create a subscription add-on

curl --request "POST" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/subscriptionAddons" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}" \
  --header "Content-Type: application/json" \
  --data '{
    "addon": "add_0SNlurA049MEWV4VxLfwJc7PJtHc",
    "subscription": "sub_0SNlurA049MEWV2gSfSxi00xlPIi"
  }'

A successful response will return the newly created subscription add-on:

Subscription add-on response

{
  "object": "subscriptionAddon",
  "id": "sad_0SNlurA049MEWV5CxLfwJc8QKsIp",
  "addon": {
    "object": "addon",
    "id": "add_0SNlurA049MEWV4VxLfwJc7PJtHc",
    "name": "1GB Europe Week Pass"
  },
  "subscription": "sub_0SNlurA049MEWV2gSfSxi00xlPIi",
  "status": "pending",
  "currentPeriod": null,
  "createdAt": "2025-12-15T10:30:00Z",
  "activatedAt": null
}

List subscription add-ons

Retrieve all add-ons attached to subscriptions in your project:

List subscription add-ons

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/subscriptionAddons" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

Filter by subscription or user:

Filter subscription add-ons

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/subscriptionAddons?subscription=sub_0SNlurA049MEWV2gSfSxi00xlPIi&status=active" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

End a subscription add-on

Remove an add-on from a subscription:

End a subscription add-on

curl --request "DELETE" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/subscriptionAddons/${SUBSCRIPTION_ADDON_ID}" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

Pricing

Add-on prices are specified in the smallest currency unit (e.g., cents for USD):

Pricing structure

{
  "price": {
    "amount": 999,
    "currency": "USD"
  }
}

The above represents $9.99 USD.


Tutorial: Searching for Travel Add-ons

This section walks through common integration patterns for travel and roaming add-ons.

Searching by Destination

When a user is planning a trip to a specific country, you can find relevant add-ons using the coverageCountry filter:

Step 1: Find add-ons for Japan

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/addons?coverageCountry=JP&status=available&type=topUp" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

The response includes both Japan-specific and regional add-ons that cover Japan. Use the coverage.name and validity fields to build your UI:

Example response

{
  "object": "list",
  "items": [
    {
      "object": "addon",
      "id": "add_japan_5gb",
      "name": "Japan 5GB",
      "type": "topUp",
      "activationTrigger": "usageStarted",
      "coverage": {
        "object": "coverage",
        "id": "cp_japan",
        "countries": ["JP"],
        "name": "Japan"
      },
      "validity": {
        "unit": "day",
        "value": 14
      },
      "allowances": {
        "dataBytes": 5000000000,
        "voiceSeconds": null,
        "smsMessages": null
      },
      "price": {
        "amount": 1499,
        "currency": "USD"
      }
    },
    {
      "object": "addon",
      "id": "add_apac_10gb",
      "name": "Asia Pacific 10GB",
      "type": "topUp",
      "activationTrigger": "usageStarted",
      "coverage": {
        "object": "coverage",
        "id": "cp_apac",
        "countries": ["JP", "KR", "TH", "SG", "MY"],
        "name": "Asia Pacific"
      },
      "validity": {
        "unit": "day",
        "value": 30
      },
      "allowances": {
        "dataBytes": 10000000000,
        "voiceSeconds": null,
        "smsMessages": null
      },
      "price": {
        "amount": 2999,
        "currency": "USD"
      }
    }
  ],
  "moreItemsAfter": null,
  "moreItemsBefore": null
}

Use the validity field to display labels such as "14 Days" or "30 Days", and the coverage.name for regional grouping in your UI.

Offering Top-ups for an Existing Travel Plan

When a user runs out of data on a travel plan, you can offer top-ups that match their existing coverage:

Step 1: Get the user's subscription and plan coverage

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/subscriptions/${SUBSCRIPTION_ID}" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

From the response, note the plan's coverage.id. Then find matching add-ons:

Step 2: List add-ons and filter by matching coverage

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/addons?status=available&type=topUp" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

Filter the results client-side to find add-ons where coverage.id matches the plan's coverage.id. This ensures the user sees only top-ups compatible with their current plan region.

Alternatively, if you know one of the countries in the plan's coverage, use the coverageCountry filter:

Alternative: Filter by a country in the plan's coverage

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/addons?coverageCountry=DE&status=available&type=topUp" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

Tutorial: Purchasing a Travel Top-up

This section covers the complete flow for purchasing and activating a travel top-up.

Step 1: Create the subscription add-on

Apply the chosen add-on to the user's subscription:

Create subscription add-on

curl --request "POST" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/subscriptionAddons" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}" \
  --header "Content-Type: application/json" \
  --data '{
    "addon": "add_japan_5gb",
    "subscription": "sub_0SNlurA049MEWV2gSfSxi00xlPIi"
  }'

This creates the subscription add-on in pending status and generates an invoice.

Step 2: Retrieve and pay the invoice

Fetch the invoice generated for this subscription add-on:

List invoices for the subscription add-on

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/invoices?subscriptionAddon=${SUBSCRIPTION_ADDON_ID}" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

After collecting payment through your payment provider, mark the invoice as paid:

Mark invoice as paid

curl --request "POST" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/invoices/${INVOICE_ID}/pay" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

Step 3: Add-on activation

Once the invoice is paid, the add-on activates based on its activationTrigger:

  • creation: The add-on activates immediately and the validity countdown begins.
  • networkLatch: The add-on activates when the device connects to a supported network.
  • usageStarted: The add-on activates when the user first uses data, voice, or SMS in a supported country.

Step 4: Monitor usage

Track usage via the subscription usage endpoint:

Check usage

curl --request "GET" \
  --url "https://api.gigs.com/projects/${GIGS_PROJECT}/subscriptions/${SUBSCRIPTION_ID}/usage" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer ${GIGS_TOKEN}"

Usage Display Considerations

When a user has both a base plan and active add-ons, consider these guidelines for displaying usage:

Unified usage is supported when the add-on coverage profile matches the base plan coverage profile and the add-on has the same validity as the subscription period. In this case, you can show a single combined gauge (e.g., "4.5 GB / 6 GB remaining").

Separate display is recommended when coverage profiles differ or validity periods do not align. Show each allowance individually with:

  • Remaining data (e.g., "3.2 GB remaining")
  • Coverage scope (e.g., "Japan only" or "Europe Zone 1")
  • Expiry date (e.g., "Expires Dec 19")

Priority System

When a user has multiple active allowances, the system consumes data from the most specific allowance first:

PriorityScopeExample
HighestCountry-specific5GB Japan
MediumRegional10GB Asia Pacific
LowestGlobal5GB Worldwide

Within the same specificity level, allowances expiring sooner are consumed first.

If you have any further questions or need assistance, please reach out to support@gigs.com.