Skip to content

External APIs (0.0.1)

Comprehensive API documentation for managing subscriptions, payments, and related operations. These APIs allow you to programmatically manage subscription lifecycles, handle payments, configure products, and integrate subscription functionality into your applications.

Languages
Servers
https://subscription-admin.appstle.com

Subscription Management

Core APIs for managing the complete subscription lifecycle including creation, updates, pausing, resuming, and cancellation of subscriptions.

Operations

Create a new subscription contract

Request

Creates a new subscription contract for a customer with specified products, billing frequency, and delivery details. This endpoint allows you to programmatically create subscriptions with custom pricing, delivery schedules, and multiple line items. The subscription will be created in Shopify and synchronized with the Appstle system.

Important Notes:

  • Customer must have at least one valid payment method
  • If paymentMethodId is not provided, the default payment method will be used
  • If delivery interval is not specified, it defaults to the billing interval
  • Custom pricing policies can be applied per line item
  • All monetary values are in the store's base currency unless currencyCode is specified
  • CustomAttributes and line item customAttributes use Shopify's AttributeInput format: {"key": "string", "value": "string"}

Pricing Policy Types:

  • SELLING_PLAN_PRICING_POLICY: Uses the default pricing from the selling plan
  • CUSTOM_PRICING_POLICY: Allows custom discount cycles defined in pricingPolicy array
  • NO_PRICING_POLICY: Uses the base price without any discounts

Authentication: Requires valid X-API-Key header

Query
api_keystringDeprecated

API Key (Deprecated)

Headers
X-API-Keystringrequired

API Key

Bodyapplication/jsonrequired
customerIdstringrequired

Shopify customer ID (numeric ID without gid prefix)

Example: "987654321"
paymentMethodIdstring

Customer payment method ID. If not provided, the default payment method will be used. Can be null if createWithoutPaymentMethod is true.

Example: "gid://shopify/CustomerPaymentMethod/abc123"
createWithoutPaymentMethodboolean

If true, creates subscription without payment method. Status will be set to PAUSED. Charges cannot be processed until a valid payment method is added.

Default false
Example: false
statusstringrequired

Initial status of the subscription contract

Enum"ACTIVE""PAUSED""CANCELLED""EXPIRED""FAILED""$UNKNOWN""ACTIVE""PAUSED""CANCELLED""EXPIRED"
Example: "ACTIVE"
nextBillingDatestring(date-time)required

Date when the next billing/order will occur

Example: "2024-02-01T00:00:00Z"
billingIntervalTypestringrequired

Billing frequency interval type

Enum"DAY""WEEK""MONTH""YEAR""$UNKNOWN""DAY""WEEK""MONTH""YEAR"
Example: "MONTH"
billingIntervalCountinteger(int32)>= 1required

Number of intervals between billings

Example: 1
maxCyclesinteger(int32)>= 1

Maximum number of billing cycles. Null for unlimited

Example: 12
minCyclesinteger(int32)>= 1

Minimum number of billing cycles required before cancellation is allowed

Example: 3
deliveryIntervalTypestring

Delivery frequency interval type. If not specified, uses billing interval

Enum"DAY""WEEK""MONTH""YEAR""$UNKNOWN""DAY""WEEK""MONTH""YEAR"
Example: "MONTH"
deliveryIntervalCountinteger(int32)>= 1

Number of intervals between deliveries. If not specified, uses billing interval count

Example: 1
deliveryFirstNamestring

Delivery address first name

Example: "John"
deliveryLastNamestring

Delivery address last name

Example: "Doe"
deliveryAddress1stringrequired

Delivery address line 1

Example: "123 Main St"
deliveryAddress2string

Delivery address line 2

Example: "Apt 4B"
deliveryProvinceCodestring

Delivery address province/state code (ISO 3166-2)

Example: "NY"
deliveryCitystringrequired

Delivery address city

Example: "New York"
deliveryZipstring

Delivery address postal/zip code

Example: "10001"
deliveryCountryCodestringrequired

Delivery address country code (ISO 3166-1 alpha-2)

Example: "US"
deliveryPhonestring

Delivery phone number

Example: "+1234567890"
deliveryPriceAmountnumber(double)

Fixed delivery price amount in store currency

Example: 5.99
currencyCodestring

Currency code for the subscription (ISO 4217). If not provided, uses store default currency

Example: "USD"
linesArray of objects(SubscriptionContractLineDTO)required

Product line items to include in the subscription

lines[].​quantityinteger(int32)>= 1required

Quantity of the product variant

Example: 2
lines[].​variantIdstringrequired

Shopify product variant ID (numeric ID without gid prefix)

Example: "42549172011164"
lines[].​productIdstring

Shopify product ID (numeric ID without gid prefix)

Example: "7234567890123"
lines[].​sellingPlanIdstring

Selling plan ID to apply to this line item. Required for subscription pricing

Example: "gid://shopify/SellingPlan/123456"
lines[].​currentPricenumber(double)

Current price per unit after discounts. If not provided, calculated from selling plan

Example: 25.99
lines[].​unitPricenumber(double)

Base price per unit before any discounts

Example: 29.99
lines[].​customAttributesArray of objects(AttributeInput)

Custom attributes for this line item

Example: [{"key":"engraving","value":"Happy Birthday"}]
lines[].​linePricingPolicystring

Pricing policy type for subscription line items

Enum"SELLING_PLAN_PRICING_POLICY""CUSTOM_PRICING_POLICY""NO_PRICING_POLICY"
Example: "SELLING_PLAN_PRICING_POLICY"
lines[].​pricingPolicyArray of objects(AppstleCycle)

Custom pricing policy cycles when linePricingPolicy is CUSTOM_PRICING_POLICY

allowDeliveryAddressOverrideboolean

Allow customer to change delivery address in customer portal

Default false
Example: false
allowDeliveryPriceOverrideboolean

Allow delivery price to be overridden

Default false
Example: false
customAttributesobject(AttributeInput)

Custom attributes to attach to the subscription contract

Example: [{"key":"subscription_type","value":"premium"},{"key":"gift_message","value":"Happy Birthday!"}]
curl -i -X POST \
  'https://subscription-admin.appstle.com/api/external/v2/subscription-contract-details/create-subscription-contract?api_key=string' \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: string' \
  -d '{
    "customerId": "987654321",
    "paymentMethodId": "gid://shopify/CustomerPaymentMethod/abc123",
    "createWithoutPaymentMethod": false,
    "status": "ACTIVE",
    "nextBillingDate": "2024-02-01T00:00:00Z",
    "billingIntervalType": "MONTH",
    "billingIntervalCount": 1,
    "maxCycles": 12,
    "minCycles": 3,
    "deliveryIntervalType": "MONTH",
    "deliveryIntervalCount": 1,
    "deliveryFirstName": "John",
    "deliveryLastName": "Doe",
    "deliveryAddress1": "123 Main St",
    "deliveryAddress2": "Apt 4B",
    "deliveryProvinceCode": "NY",
    "deliveryCity": "New York",
    "deliveryZip": "10001",
    "deliveryCountryCode": "US",
    "deliveryPhone": "+1234567890",
    "deliveryPriceAmount": 5.99,
    "currencyCode": "USD",
    "lines": [
      {
        "quantity": 2,
        "variantId": "42549172011164",
        "productId": "7234567890123",
        "sellingPlanId": "gid://shopify/SellingPlan/123456",
        "currentPrice": 25.99,
        "unitPrice": 29.99,
        "customAttributes": [
          {
            "key": "engraving",
            "value": "Happy Birthday"
          }
        ],
        "linePricingPolicy": "SELLING_PLAN_PRICING_POLICY",
        "pricingPolicy": [
          {
            "afterCycle": 3,
            "discountType": "PERCENTAGE",
            "value": 10,
            "freeVariantId": 42549172011164,
            "freeProductHandle": "free-gift-product",
            "repeatingCycle": true,
            "repeatingNumberOfCycle": 6,
            "preventDuplicationFreeProduct": true
          }
        ]
      }
    ],
    "allowDeliveryAddressOverride": false,
    "allowDeliveryPriceOverride": false,
    "customAttributes": [
      {
        "key": "subscription_type",
        "value": "premium"
      },
      {
        "key": "gift_message",
        "value": "Happy Birthday!"
      }
    ]
  }'

Responses

Subscription contract successfully created

Bodyapplication/json
get__typenamestring
idstring
createdAtobject
updatedAtobject
nextBillingDateobject
statusstring
Enum"ACTIVE""PAUSED""CANCELLED""EXPIRED""FAILED""$UNKNOWN"
deliveryPriceobject(DeliveryPrice)
lastPaymentStatusstring
Enum"SUCCEEDED""FAILED""$UNKNOWN"
billingPolicyobject(BillingPolicy)
deliveryPolicyobject(DeliveryPolicy)
linesobject(Lines)
customerPaymentMethodobject(CustomerPaymentMethod)
deliveryMethodobject(DeliveryMethod)
originOrderobject(OriginOrder)
customerobject(Customer)
discountsobject(Discounts)
notestring
customAttributesArray of objects(CustomAttribute1)
billingAttemptsobject(BillingAttempts)
Response
application/json
{ "id": "gid://shopify/SubscriptionContract/123456789", "status": "ACTIVE", "nextBillingDate": "2024-02-01T00:00:00Z", "billingPolicy": { "interval": "MONTH", "intervalCount": 1, "minCycles": 3, "maxCycles": 12 }, "deliveryPolicy": { "interval": "MONTH", "intervalCount": 1 }, "customer": { "id": "gid://shopify/Customer/987654321", "email": "customer@example.com", "firstName": "John", "lastName": "Doe" }, "deliveryPrice": { "amount": "5.99", "currencyCode": "USD" }, "lines": { "edges": [] } }

Get raw Shopify GraphQL contract response

Request

Retrieves the complete, unprocessed subscription contract data directly from Shopify's GraphQL API. This endpoint returns the full Shopify subscription contract object exactly as Shopify provides it, including all nested fields, relationships, and GraphQL metadata.

What This Endpoint Returns: Unlike processed/transformed endpoints, this returns Shopify's raw SubscriptionContract GraphQL object with all available fields. This is the same data structure you would receive if querying Shopify's GraphQL API directly, making it ideal for:

  • Debugging Shopify data synchronization issues
  • Accessing fields not exposed in other endpoints
  • Understanding complete Shopify contract structure
  • Building custom integrations requiring full data
  • Comparing Shopify source data with processed data

Data Included:

Contract Core:

  • Full subscription contract object from Shopify
  • All GraphQL __typename fields preserved
  • Complete nested object structures
  • All available Shopify contract fields

Customer Information:

  • Complete customer object with all fields
  • Default address details
  • Customer tags and metadata
  • Marketing preferences

Line Items:

  • Full line item details with edges/nodes structure
  • Product and variant complete objects
  • Pricing policies with all cycle discounts
  • Line item custom attributes
  • Current and original prices

Billing & Delivery:

  • Complete billing policy object
  • Full delivery policy details
  • Delivery method with all fields
  • Delivery price breakdown
  • Billing anchor details

Payment Information:

  • Payment method details (if available)
  • Customer payment instrument
  • Payment gateway information

Orders & History:

  • Origin order details
  • Last payment status
  • Historical billing attempts (in Appstle)

Use Cases:

1. Debugging & Troubleshooting:

  • Investigate data sync discrepancies
  • Verify what Shopify actually stores
  • Debug webhook payload issues
  • Compare expected vs actual data

2. Advanced Integrations:

  • Access Shopify-specific fields not in standard APIs
  • Build custom analytics using raw data
  • Integrate with Shopify GraphQL directly
  • Extract fields for custom processing

3. Data Analysis:

  • Analyze complete contract structure
  • Extract all available metadata
  • Build comprehensive data exports
  • Perform deep data audits

4. Development & Testing:

  • Understand Shopify's data model
  • Test new feature development
  • Verify API responses
  • Documentation and examples

Response Structure:

Returns SubscriptionContractQuery.SubscriptionContract object:

{
  "id": "gid://shopify/SubscriptionContract/123456789",
  "status": "ACTIVE",
  "nextBillingDate": "2024-03-15T00:00:00Z",
  "customer": {
    "id": "gid://shopify/Customer/987654321",
    "email": "customer@example.com",
    "displayName": "John Doe",
    "__typename": "Customer"
  },
  "lines": {
    "edges": [
      {
        "node": {
          "id": "gid://shopify/SubscriptionLine/111111",
          "quantity": 2,
          "variantId": "gid://shopify/ProductVariant/222222",
          "title": "Monthly Coffee Box",
          "variantTitle": "Medium Roast",
          "currentPrice": {
            "amount": "29.99",
            "currencyCode": "USD"
          },
          "pricingPolicy": {...},
          "__typename": "SubscriptionLine"
        }
      }
    ]
  },
  "billingPolicy": {
    "interval": "MONTH",
    "intervalCount": 1,
    "minCycles": 3,
    "maxCycles": 12
  },
  "deliveryPolicy": {...},
  "deliveryMethod": {...},
  "__typename": "SubscriptionContract"
}

Important Considerations:

Data Source:

  • Queries Shopify GraphQL API in real-time
  • NOT cached in Appstle database
  • Always returns current Shopify state
  • Subject to Shopify API rate limits

Performance:

  • Slower than database queries (500-1500ms typical)
  • Makes real-time call to Shopify
  • Response size can be large (10-50 KB)
  • Use sparingly to avoid rate limits

GraphQL Structure:

  • Includes __typename fields throughout
  • Uses GraphQL ID format (gid://shopify/...)
  • Nested edges/nodes structure for lists
  • All fields as defined in Shopify's schema

Best Practices:

  1. Use for Debugging: Perfect for troubleshooting data issues
  2. Avoid Polling: Don't call repeatedly - use cached/processed endpoints instead
  3. Cache Response: Cache the response if using for display
  4. Parse Carefully: Handle GraphQL structure (edges/nodes)
  5. Monitor Rate Limits: Each call counts against Shopify API limits

When to Use vs Other Endpoints:

Use this endpoint when:

  • Need complete Shopify contract data
  • Debugging synchronization issues
  • Accessing Shopify-specific fields
  • Building Shopify GraphQL integrations

Use /api/external/v2/subscription-contract-details when:

  • Need processed, filtered contract data
  • Want faster response times
  • Querying multiple contracts
  • Building customer-facing UIs

Authentication: Requires valid X-API-Key header

Path
contractIdinteger(int64)required

Contract ID

Query
api_keystring

API Key (Deprecated - Use Header X-API-Key instead)

Headers
X-API-Keystring
curl -i -X GET \
  'https://subscription-admin.appstle.com/api/external/v2/subscription-contracts/contract-external/{contractId}?api_key=string' \
  -H 'X-API-Key: string'

Responses

Successfully retrieved raw Shopify contract data

Bodyapplication/json
get__typenamestring
idstring
createdAtobject
updatedAtobject
nextBillingDateobject
statusstring
Enum"ACTIVE""PAUSED""CANCELLED""EXPIRED""FAILED""$UNKNOWN"
deliveryPriceobject(DeliveryPrice)
lastPaymentStatusstring
Enum"SUCCEEDED""FAILED""$UNKNOWN"
billingPolicyobject(BillingPolicy)
deliveryPolicyobject(DeliveryPolicy)
linesobject(Lines)
customerPaymentMethodobject(CustomerPaymentMethod)
deliveryMethodobject(DeliveryMethod)
originOrderobject(OriginOrder)
customerobject(Customer)
discountsobject(Discounts)
notestring
customAttributesArray of objects(CustomAttribute1)
billingAttemptsobject(BillingAttempts)
Response
application/json
{ "get__typename": "string", "id": "string", "createdAt": {}, "updatedAt": {}, "nextBillingDate": {}, "status": "ACTIVE", "deliveryPrice": { "get__typename": "string", "amount": {}, "currencyCode": "USD" }, "lastPaymentStatus": "SUCCEEDED", "billingPolicy": { "get__typename": "string", "interval": "DAY", "intervalCount": 0, "anchors": [], "maxCycles": 0, "minCycles": 0 }, "deliveryPolicy": { "get__typename": "string", "interval": "DAY", "intervalCount": 0, "anchors": [] }, "lines": { "get__typename": "string", "nodes": [], "pageInfo": {} }, "customerPaymentMethod": { "get__typename": "string", "id": "string", "instrument": {}, "revokedAt": {}, "revokedReason": "AUTHORIZE_NET_GATEWAY_NOT_ENABLED" }, "deliveryMethod": { "get__typename": "string" }, "originOrder": { "get__typename": "string", "id": "string", "name": "string", "fulfillmentOrders": {} }, "customer": { "get__typename": "string", "id": "string", "email": "string", "displayName": "string", "firstName": "string", "lastName": "string", "phone": "string" }, "discounts": { "get__typename": "string", "nodes": [], "pageInfo": {} }, "note": "string", "customAttributes": [ {} ], "billingAttempts": { "get__typename": "string", "nodes": [] } }

Get subscription fulfillment details for latest order

Request

Retrieves fulfillment information for the most recent successful order associated with a subscription contract. This includes tracking details, shipment status, delivery estimates, and fulfillment line items from Shopify.

What This Endpoint Returns: Complete fulfillment data for the subscription's last successfully billed order, queried in real-time from Shopify's GraphQL API. Shows customers when and how their subscription items will be (or were) delivered.

Fulfillment Data Included:

Shipment Tracking:

  • Tracking numbers and URLs
  • Carrier information (USPS, FedEx, UPS, etc.)
  • Tracking company details
  • Tracking status updates

Delivery Status:

  • Fulfillment status (fulfilled, in_transit, out_for_delivery, delivered, etc.)
  • Estimated delivery date
  • Actual delivery timestamp (if delivered)
  • Delivery method (shipping, pickup, local delivery)

Fulfillment Details:

  • Fulfilled line items (which products shipped)
  • Quantities fulfilled
  • Fulfillment service (manual, automated, 3PL)
  • Fulfillment created/updated dates
  • Multiple fulfillments (if order shipped in parts)

Location Information:

  • Fulfillment location/warehouse
  • Origin address details
  • Fulfillment service name

Order Determination Logic:

Which Order is Retrieved:

  1. Finds most recent SUCCESS billing attempt for contract
  2. If found: Uses that order's Shopify order ID
  3. If none: Falls back to subscription's origin order ID
  4. Queries Shopify for that order's fulfillments

Why This Matters:

  • Shows CURRENT/LATEST fulfillment status
  • Not historical fulfillments from months ago
  • Reflects what customer is waiting for NOW
  • Updates after each new billing cycle

Use Cases:

1. Customer Portal "Where's My Order":

  • Display tracking information
  • Show estimated delivery date
  • Provide carrier tracking links
  • Update fulfillment status

2. Subscription Order Tracking:

  • Track recurring order deliveries
  • Monitor fulfillment progress
  • Identify delayed shipments
  • Provide proactive delivery updates

3. Customer Support:

  • Answer "where is my order" questions
  • Verify shipment details
  • Troubleshoot delivery issues
  • Provide accurate tracking info

4. Automated Notifications:

  • Send tracking emails automatically
  • Notify customers of shipments
  • Alert on delivery completion
  • Trigger review request flows

5. Subscription Management:

  • Show fulfillment in subscription history
  • Display delivery patterns
  • Track fulfillment reliability
  • Monitor shipping performance

Response Structure:

Returns Shopify Order object with fulfillments:

{
  "id": "gid://shopify/Order/123456789",
  "name": "#1001",
  "fulfillmentOrders": {
    "edges": [
      {
        "node": {
          "id": "gid://shopify/FulfillmentOrder/111111",
          "status": "SUCCESS",
          "fulfillments": {
            "edges": [
              {
                "node": {
                  "trackingInfo": [
                    {
                      "number": "1Z999AA10123456784",
                      "url": "https://wwwapps.ups.com/tracking/...",
                      "company": "UPS"
                    }
                  ],
                  "status": "IN_TRANSIT",
                  "estimatedDeliveryAt": "2024-03-20T00:00:00Z",
                  "deliveredAt": null
                }
              }
            ]
          }
        }
      }
    ]
  }
}

Common Scenarios:

Scenario: Order Fulfilled & Shipped

{
  "trackingInfo": [{"number": "9400...", "company": "USPS"}],
  "status": "IN_TRANSIT",
  "estimatedDeliveryAt": "2024-03-18T00:00:00Z"
}

Scenario: Order Delivered

{
  "status": "DELIVERED",
  "deliveredAt": "2024-03-15T14:23:00Z"
}

Scenario: Not Yet Fulfilled

{
  "fulfillmentOrders": {
    "edges": [
      {
        "node": {
          "status": "OPEN",
          "fulfillments": {"edges": []}
        }
      }
    ]
  }
}

Scenario: No Order Yet (New Subscription) Returns null or empty response

Important Considerations:

Real-Time Shopify Query:

  • Makes live call to Shopify GraphQL API
  • NOT cached data
  • Response time: 500-1500ms
  • Subject to Shopify rate limits

Data Freshness:

  • Returns current fulfillment status from Shopify
  • Tracking updates reflect Shopify's data
  • May lag behind carrier's actual status
  • Shopify updates tracking periodically

Null Responses:

  • Returns null if no orders exist yet
  • Returns null if order ID not found
  • Handle gracefully in UI

Multiple Fulfillments:

  • Order may have multiple fulfillments (split shipments)
  • Each fulfillment has own tracking
  • Iterate through all fulfillment nodes

Integration Example:

Customer Portal - Track Shipment:

const order = await fetch(
  `/api/external/v2/subscription-contract-details/subscription-fulfillments/${contractId}`,
  { headers: { 'X-API-Key': 'your-key' } }
).then(r => r.json());

if (!order) {
  return '<p>No shipment information available yet.</p>';
}

const fulfillments = order.fulfillmentOrders?.edges || [];
fulfillments.forEach(fo => {
  fo.node.fulfillments?.edges?.forEach(f => {
    const tracking = f.node.trackingInfo?.[0];
    if (tracking) {
      console.log(`Track with ${tracking.company}: ${tracking.number}`);
      console.log(`URL: ${tracking.url}`);
    }
  });
});

Best Practices:

  1. Cache Response: Cache for 30-60 minutes to reduce Shopify API calls
  2. Handle Nulls: Always check for null/empty responses
  3. Parse GraphQL: Navigate edges/nodes structure carefully
  4. Show All Tracking: Display all fulfillments if multiple shipments
  5. Link to Carrier: Provide clickable tracking URLs

Authentication: Requires valid X-API-Key header

Path
contractIdinteger(int64)required

Contract ID

Query
api_keystring

API Key (Deprecated - Use Header X-API-Key instead)

Headers
X-API-Keystring
curl -i -X GET \
  'https://subscription-admin.appstle.com/api/external/v2/subscription-contract-details/subscription-fulfillments/{contractId}?api_key=string' \
  -H 'X-API-Key: string'

Responses

Successfully retrieved fulfillment details (may be null if no orders exist)

Bodyapplication/json
get__typenamestring
idstring
fulfillmentOrdersobject(FulfillmentOrders)
Response
application/json
{ "get__typename": "string", "id": "string", "fulfillmentOrders": { "get__typename": "string", "nodes": [], "pageInfo": {} } }

Subscription Payments

APIs for managing subscription payment methods, processing payments, handling payment retries, and updating billing information.

Operations

Subscription Contracts

APIs for managing subscription contracts including delivery schedules, pricing, order notes, billing cycles, and shipping addresses.

Operations

Subscription Products

APIs for managing products within subscriptions including adding, removing, updating quantities, and swapping products.

Operations

Billing & Payments

APIs for handling billing operations, payment processing, and financial transactions related to subscriptions.

Operations

Subscription Discounts

APIs for managing discounts and promotional codes applied to subscriptions.

Operations

Subscription One-Time Products

APIs for managing one-time add-on products that can be purchased alongside recurring subscription items.

Operations

Subscription Plans

APIs for managing subscription plans, pricing tiers, and plan configurations.

Operations

Build-a-Box & Bundles

APIs for managing customizable product boxes and bundles where customers can select multiple items.

Operations

Product Catalog

APIs for managing the product catalog including product information, variants, and inventory.

Operations

Operations & Settings

APIs for managing operational settings, configurations, and administrative functions.

Operations

Customer Portal

APIs powering the customer-facing portal where subscribers can manage their own subscriptions.

Operations

Customers

APIs for managing customer information, profiles, and account details.

Operations