Introduction

Welcome to the Magpie API documentation. Magpie is a B2B distribution platform for tours, activities, and attractions — connecting operators with resellers like OTAs, DMOs, and travel agents.

This API provides programmatic access to supplier account data, product catalogues, and content on the Magpie platform. It's designed for resellers, booking systems, and integration partners who need to pull structured product and company information.

The API is organised into three sections:

OCTO Core — Industry-standard fields following the OCTO specification. These are the fields any OCTO-compatible system expects: accounts, products, options, and units.

Magpie Extended (MP+) — Additional fields beyond the OCTO standard that provide richer operational detail: guest restrictions, group sizing, difficulty levels, and more.

Content Feed API — Bulk endpoints for retrieving complete datasets in multiple formats (JSON, JSON-LD, Markdown, and others). Ideal for populating catalogues, feeding CMS or AI systems, or syncing data.

For V1 API documentation, visit this page.

Authentication

All OCTO Core and MP+ endpoints require an API key. You can find your key under Profile → Settings in your Magpie dashboard.

Option 1 — Header (recommended)

Include the X-Api-Key header with every request:

HTTP Request
GET /api/accounts/{accountId} HTTP/1.1
Host: magpie.travel
Accept: application/json
X-Api-Key: your_api_key_here

Option 2 — Query Parameter

Alternatively, pass the key as a query parameter:

URL
https://magpie.travel/api?api_key=your_api_key_here

If the API key is missing or invalid, the API returns a 401 Unauthorized response.

Account

The Account resource describes a supplier (operator) on the Magpie platform — their company information, contact details, social profiles, locations, and media.

GET /api/accounts/{accountId}

Example Response

200 OK — application/json
{
  "account": {
    "id": "d7a11efb-da83-4715-b8b3-f2c2ce74f81e",
    "name": "Skyline Sightseeing",
    "telephone": "+1-555-123-4567",
    "website": "https://www.skylinesightseeing.com",
    "description": "Skyline Sightseeing is a renowned sightseeing tour agency...",
    "category": "Tour Operator",
    "secondaryCategory": "Transportation",
    "logo": "https://assets.magpie.travel/accounts/logos/skyline.png",
    "timeZone": "America/Los_Angeles",
    "banner": "https://assets.magpie.travel/accounts/banners/skyline-banner.jpg",
    "email": "[email protected]",
    "locale": "en-US",
    "linkedinHandle": "skylinesightseeing",
    "facebookHandle": "Skyline",
    "instagramHandle": "skysightseeing",
    "xHandle": "skylinetours",
    "youtubeHandle": "skylinechannel",
    "tiktokHandle": "skylinetours",
    "tripadvisorHandle": "skyline-sightseeing",
    "googleHandle": "skylinesightseeing",
    "tradeUrl": "https://trade.skylinesightseeing.com",
    "tradeEmail": "[email protected]",
    "requirements": "Having the tourists, investing in our company...",
    "productDescription": "Travel Guides, Tours, Escorted tours and more",
    "bookingSystemsId": ["TourOpp", "Tripnect"],
    "faqs": [
      {
        "question": "What time do buses start in the morning",
        "answer": "Buses start at 9am and stop at 5pm during the week, and 6pm on weekends."
      },
      {
        "question": "How often do buses run",
        "answer": "Buses run every 15-30 mins."
      },
      {
        "question": "Are tickets to attractions included in the tour",
        "answer": "No, the tour does not include entrance fees to attractions."
      }
    ],
    "media": [
      {
        "src": "https://res.cloudinary.com/example/image/logo.png",
        "type": "image/png",
        "rel": "LOGO",
        "title": "Company Logo",
        "caption": "Official logo of the tour company",
        "copyright": "© 2025 Tour Company"
      }
    ],
    "locations": [
      {
        "title": "99 Jefferson Street, San Francisco, CA 94133, USA",
        "shortDescription": null,
        "type": "BUSINESS_ADDRESS",
        "place": {
          "latitude": 37.807864,
          "longitude": -122.413939,
          "streetAddress": "99 Jefferson Street",
          "addressLocality": "San Francisco",
          "addressRegion": "California",
          "postalCode": "94133",
          "addressCountry": "United States"
        }
      }
    ]
  }
}

Account Fields

FieldTypeDescription
iduuidUnique identifier for the account
namestringCompany name
telephonestringPrimary contact telephone number
websitestringCompany website URL
descriptiontextDetailed description of the company
categorystringPrimary business category
secondaryCategorystringSecondary business category
logostringURL to company logo image
bannerstringURL to company banner image
timeZonestringCompany's primary time zone (IANA format)
emailstringPrimary contact email address
localestringDefault locale (IETF BCP 47 tag)
linkedinHandlestringLinkedIn profile name
facebookHandlestringFacebook profile name
instagramHandlestringInstagram profile name
xHandlestringX (Twitter) profile name
youtubeHandlestringYouTube channel name
tiktokHandlestringTikTok profile name
tripadvisorHandlestringTripAdvisor listing name
googleHandlestringGoogle Business Profile name
tradeUrlstringURL for trade/B2B portal
tradeEmailstringContact email for trade partners
requirementsstringRequirements to work with this supplier
productDescriptionstringSummary of products offered
bookingSystemsId[]arrayExternal booking system identifiers
faqs[]arrayFrequently asked questions
faqs[].questionstringThe question text
faqs[].answerstringThe answer text
media[]arrayMedia files (images, video) at stable URLs
media[].srcstringPublicly accessible URL of the media file
media[].typestringMIME type (e.g., image/jpeg, video/mp4, external/youtube)
media[].relstringRelationship to the content: LOGO, COVER, GALLERY
media[].titlestring/nullTitle of the media
media[].captionstring/nullCaption providing context
media[].copyrightstring/nullCopyright or usage restrictions
locations[]arrayGeographical locations for the account
locations[].titlestring/nullName of the location
locations[].shortDescriptionstring/nullBrief description
locations[].typestringRole of the location (see Location Types)
locations[].placeobjectGeospatial and postal address data
locations[].place.latitudefloatLatitude in decimal degrees
locations[].place.longitudefloatLongitude in decimal degrees
locations[].place.streetAddressstring/nullStreet address
locations[].place.addressLocalitystring/nullCity or locality
locations[].place.addressRegionstring/nullState or region
locations[].place.postalCodestring/nullPostal or ZIP code
locations[].place.addressCountrystring/nullCountry

Product

The Product resource describes an experience available for sale — a tour, activity, attraction entry, or package. It includes everything a reseller needs: content (title, descriptions, media), logistics (locations, duration, availability type), commercial terms (pricing, cancellation, restrictions), and delivery details.

Get Single Product

GET /api/products/{productId}

Example Response

200 OK — application/json
{
  "product": {
    "id": "1fb7a9bc-3479-43a3-afe3-a788e508feba",
    "internalName": "Hop-On Hop-Off of San Francisco",
    "reference": "HoHo-SF1",
    "locale": "en",
    "timeZone": "America/Los_Angeles",
    "allowFreesale": false,
    "availabilityRequired": true,
    "instantConfirmation": true,
    "instantDelivery": true,
    "availabilityType": ["OPENING_HOURS", "START_TIME"],
    "deliveryMethods": ["TICKET", "VOUCHER"],
    "deliveryFormats": ["QRCODE", "PDF_URL"],
    "redemptionMethod": ["DIGITAL", "MANIFEST"],
    "title": "San Francisco Bus Tour - 2 Day Hop-On Hop-Off",
    "shortDescription": "Discover San Francisco with our Hop On - Hop Off Bus Tour...",
    "description": "Get ready for an unforgettable journey as our open-top buses...",
    "features": [
      { "type": "INCLUSION", "shortDescription": "2 Day Ticket" },
      { "type": "EXCLUSION", "shortDescription": "Tips & gratuities" },
      { "type": "HIGHLIGHT", "shortDescription": "Explore iconic sights and neighborhoods" },
      { "type": "CANCELLATION_TERM", "shortDescription": "Full refund if cancelled 24hrs before." }
    ],
    "faqs": [
      {
        "question": "What time do buses start?",
        "answer": "Buses start at 9am and stop at 5pm weekdays, 6pm weekends."
      }
    ],
    "media": [
      {
        "src": "https://res.cloudinary.com/example/image/cover.jpg",
        "type": "image/jpeg",
        "rel": "COVER",
        "title": "Tour Cover Image",
        "caption": "San Francisco Bus Tour panoramic view",
        "copyright": "© 2025 Tour Company"
      }
    ],
    "locations": [
      {
        "title": "2800 Leavenworth St, San Francisco, CA 94133",
        "shortDescription": null,
        "type": "START",
        "place": {
          "latitude": 37.807018,
          "longitude": -122.418756,
          "streetAddress": "2800 Leavenworth Street",
          "addressLocality": "San Francisco",
          "addressRegion": "California",
          "postalCode": "94133",
          "addressCountry": "United States"
        }
      }
    ],
    "categoryLabels": ["wheelchair-accessible", "skip-the-line"],
    "durationMinutesFrom": 2880,
    "durationMinutesTo": null,
    "commentary": [
      { "format": "IN_PERSON", "language": "en" },
      { "format": "RECORDED_AUDIO", "language": "es" }
    ],
    "defaultCurrency": "USD",
    "availableCurrencies": [],
    "pricingPer": [],
    "options": [
      {
        "id": "1fb7a9bc-3479-43a3-afe3-a788e508feba",
        "name": "2-Day Pass",
        "description": "Standard 2-day hop-on hop-off pass",
        "units": [
          {
            "id": "adult",
            "type": "ADULT",
            "pricingFrom": [{
              "original": 5999,
              "retail": 5999,
              "net": 4999,
              "currency": "USD",
              "currencyPrecision": 2
            }]
          }
        ]
      }
    ]
  }
}

Get Products List

Retrieve a paginated list of products with support for filtering by product IDs, version type, and version name. This endpoint supports language negotiation via the Accept-Language header.

GET /api/products/getProducts

Query Parameters

ParameterTypeDescription
pageintegerPage number (default: 1)
per_pageintegerItems per page (default: 10)
product_idsstringComma-separated list of product IDs to filter (optional)
version_typestringFilter by version type. Supported values vary by configuration (optional)
version_namestringFilter by version name (optional)

Request Headers

HeaderDescription
Accept-LanguagePreferred language (IETF BCP 47 tag). Only one language allowed. Example: en or es
X-Api-KeyYour API key for authentication

Response Headers

HeaderDescription
Available-LanguagesComma-separated list of available languages for the returned products

Example Request

HTTP Request
GET /api/products/getProducts?page=1&per_page=10 HTTP/1.1
Host: magpie.travel
Accept: application/json
Accept-Language: en
X-Api-Key: your_api_key_here

Example Request with Filters

HTTP Request - Filter by Product IDs
GET /api/products/getProducts?product_ids=ID1,ID2,ID3&page=1 HTTP/1.1
Host: magpie.travel
Accept: application/json
Accept-Language: en
X-Api-Key: your_api_key_here
HTTP Request - Filter by Version
GET /api/products/getProducts?version_type=primary&version_name=v2&page=1 HTTP/1.1
Host: magpie.travel
Accept: application/json
Accept-Language: es
X-Api-Key: your_api_key_here

Example Response

200 OK — application/json
{
  "products": [
    {
      "id": "1fb7a9bc-3479-43a3-afe3-a788e508feba",
      "title": "San Francisco Bus Tour - 2 Day Hop-On Hop-Off",
      "locale": "en",
      "shortDescription": "Discover San Francisco...",
      "defaultCurrency": "USD"
      // ... other product fields ...
    },
    {
      "id": "2bc8b1cd-4580-54b4-bge4-b899f619fcfb",
      "title": "Golden Gate Bridge Walking Tour",
      "locale": "en",
      "shortDescription": "Guided walk across the iconic bridge...",
      "defaultCurrency": "USD"
      // ... other product fields ...
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 10,
    "total_pages": 5,
    "total_count": 47,
    "next_page": 2,
    "prev_page": null
  }
}
Language Negotiation
If a product is not available in the requested language, the API will return the product in the default language (typically English). Check the locale field in each product to see which language was returned.

Error Responses

Status CodeErrorDescription
400Bad RequestMultiple languages in Accept-Language header or invalid version_type
404Not FoundNo products found with the specified version_name
401UnauthorizedMissing or invalid API key
400 Bad Request — Multiple Languages
{
  "error": "Only one language is allowed in Accept-Language header"
}
400 Bad Request — Invalid Version Type
{
  "error": "Invalid version_type"
}
404 Not Found — Version Name
{
  "error": "No products found with version_name: 'v3'"
}

Product Fields

FieldTypeDescription
idstringUnique product identifier in Magpie
internalNamestringThe supplier's internal name for this product
referencestring/nullOptional supplier reference code
localestringContent language (IETF BCP 47 tag)
timeZonestringProduct time zone (IANA identifier)
allowFreesalebooleanWhether bookings can be made without querying availability first
availabilityRequiredbooleanWhether an availabilityId is required when creating a booking
instantConfirmationbooleanWhether bookings are confirmed immediately
instantDeliverybooleanWhether tickets are delivered immediately upon confirmation
availabilityType[]arraySTART_TIME (fixed departures) or OPENING_HOURS (visit anytime during operating hours)
deliveryMethods[]arrayTICKET (per unit) or VOUCHER (per booking)
deliveryFormats[]arrayTicket formats: QRCODE, CODE128, AZTECCODE, PDF_URL, PKPASS_URL
redemptionMethod[]arrayMANIFEST (name on list), DIGITAL (scan on mobile), PRINT (physical printout)
titlestringCustomer-facing product name
shortDescriptionstring/nullBrief customer-facing description
descriptionstring/nullDetailed product description
features[]arrayArray of feature objects (see Feature Types)
features[].typestringFeature type enum value
features[].shortDescriptionstring/nullDescription of the feature
faqs[]arrayProduct-specific frequently asked questions
faqs[].questionstringThe question text
faqs[].answerstringThe answer text
media[]arrayMedia files at stable URLs
media[].srcstringPublicly accessible media URL
media[].typestringMIME type of the media file
media[].relstringLOGO, COVER, or GALLERY
media[].titlestring/nullTitle of the media
media[].captionstring/nullCaption providing context
media[].copyrightstring/nullCopyright or usage restrictions
locations[]arrayLocations associated with the product
locations[].titlestring/nullLocation name
locations[].shortDescriptionstring/nullBrief description
locations[].typestringRole of the location (see Location Types)
locations[].placeobjectGeospatial and postal address data
categoryLabels[]arrayCategory labels (see Category Labels)
durationMinutesFromintegerMinimum duration in minutes
durationMinutesTointeger/nullMaximum duration if flexible; null if fixed
commentary[]arrayCommentary/guide options available
commentary[].formatstringIN_PERSON, RECORDED_AUDIO, WRITTEN, or OTHER
commentary[].languagestringLanguage code (IETF BCP 47)
defaultCurrencystringDefault currency (ISO 4217)
availableCurrencies[]arraySupported currencies (ISO 4217)
pricingPer[]arrayUNIT or BOOKING
options[]arrayProduct variations (see Options)

Options

Options represent variations of a product — for example, a "1-Day Pass" vs a "2-Day Pass", or "Morning Tour" vs "Sunset Tour". Every product has at least one option.

Option Fields

FieldTypeDescription
idstringUnique identifier for this option
namestringCustomer-facing name (e.g., "2-Day Package")
referencestring/nullOptional supplier reference code
descriptionstring/nullDetailed description of this option
units[]arrayPricing categories within this option (see Units)

Units

Units represent pricing categories within an option — such as Adult, Child, or Senior. Each unit has its own pricing.

Pricing note Prices are expressed in the smallest currency unit (e.g., cents for USD). A value of 5999 with currencyPrecision: 2 means $59.99.

Unit Fields

FieldTypeDescription
idstringUnique identifier for this unit
typestringUnit type (see Unit Types below)
option_idstringID of the parent option
pricingFrom[]arrayPricing information
pricingFrom[].originalintegerOriginal price in smallest currency unit
pricingFrom[].retailintegerCustomer-facing retail price
pricingFrom[].netinteger/nullNet price (before markup), or null
pricingFrom[].currencystringISO 4217 currency code
pricingFrom[].currencyPrecisionintegerDecimal places for the currency (e.g., 2 for USD)

Unit Types

ValueDescription
ADULTStandard adult pricing
CHILDYounger participants, usually with age restrictions
YOUTHAdolescents/teenagers, between child and adult
SENIOROlder participants, typically with age minimums
STUDENTValid student identification required
FAMILYPackage for a defined group (e.g., 2 adults + 2 children)
INFANTVery young participants (usually under 2–3 years), often free
GROUPBlock pricing for a specified number of participants
MILITARYActive or retired military with valid ID
RESIDENTLocal residents with proof of residency

Feature Types

Each product can have multiple features that describe what's included, what's excluded, key highlights, and important terms. Each feature has a type and a shortDescription.

TypeDescriptionExamples
INCLUSIONWhat is included in the experience"Hotel pickup included", "Lunch provided"
EXCLUSIONWhat is NOT included"Gratuities not included", "Admission tickets separate"
HIGHLIGHTKey selling points or unique aspects"Skip-the-line access", "Small-group expert-guided tour"
PREBOOKING_INFORMATIONCritical info customers must know before booking"Minimum age 12", "Moderate fitness level required"
PREARRIVAL_INFORMATIONInstructions and tips before arrival"Bring photo ID", "Wear warm clothing"
REDEMPTION_INSTRUCTIONHow to redeem the booking"Present mobile voucher at entrance", "Check-in at kiosk"
ACCESSIBILITY_INFORMATIONAccessibility features or limitations"Wheelchair accessible", "Not suitable for mobility impairments"
BOOKING_TERMTerms related to booking and payment"Full payment at booking", "Confirmation within 24 hours"
CANCELLATION_TERMCancellation and refund policies"Full refund if cancelled 72hrs before", "No refunds within 24hrs"
RESTRICTIONSConditions or limitations guests must adhere to"Max weight 250 lbs", "No pets", "No alcohol before activity"
REQUIREMENTSMandatory conditions or documentation"Valid driver's license", "Signed waiver needed"
ADDITIONAL_INFORMATIONSupplementary details"Bring sunscreen", "Weather may affect itinerary"

Location Types

ValueDescription
STARTStarting point or meeting location where customers gather before the activity
ENDFinal point or drop-off location where the activity concludes
BUSINESS_ADDRESSOfficial business address of the service provider
GOOGLE_BUSINESS_PROFILELocation from the provider's Google Business Profile
REDEMPTIONLocation where customers exchange tickets or collect passes before the experience
POINT_OF_INTERESTNotable location customers may see or pass by (used for sightseeing)

Category Labels

ValueDescription
private-toursExclusive tours with no other participants
multi-dayProducts spanning multiple days, typically with accommodation
wheelchair-accessibleAccessible for wheelchair users
accommodation-includedLodging included in the package
food-includedMeals included during the experience
drinks-includedBeverages included during the experience
skip-the-linePriority access or expedited entry

Magpie Extended (MP+)

MP+ fields provide additional operational and logistical detail beyond the OCTO standard. They help resellers create richer product listings and set accurate customer expectations around group sizes, difficulty levels, guest restrictions, and more.

Where do MP+ fields appear? These fields are returned as part of the Product response body, alongside the OCTO Core fields documented above. They are not a separate endpoint — when you call GET /api/products/{productId}, both OCTO and MP+ fields are included in the response.

MP+ endpoints use the same API key authentication as OCTO Core.

Extended Fields

Booking & Confirmation

FieldTypeDescription
confirmationNecessarybooleanCustomer is required to confirm before travel
startDatedateDate when the product starts operating
endDatedateDate when the product stops operating
redemptionTypestringHow tickets are redeemed: held at office, or voucher scanned/collected

Group & Capacity

FieldTypeDescription
bookingMinPaxintegerMinimum guests per booking
bookingMaxPaxintegerMaximum guests per booking
maxGroupSizeintegerMaximum group size on the product

Activity Details

FieldTypeDescription
categorystringProduct category (e.g., "Tours & Sightseeing")
guideTypestringTour Guide, Host, Greeter, Instructor, or Driver
tripDifficultystringEasy, Moderate, or Challenging
emergencyPhonestringEmergency phone number for guests

Guest Restrictions

FieldTypeDescription
ageRestrictionTypestringType of age restriction (e.g., MinAge)
ageRestrictionValueintegerAge value in years
heightRestrictionTypestringMinimum or Maximum height restriction
heightRestrictionValueintegerHeight restriction value
heightRestrictionUnitstringcm or inches
weightRestrictionTypestringMinimum or Maximum weight restriction
weightRestrictionValueintegerWeight restriction value
weightRestrictionUnitstringKg or Lbs

Guest Requirements

FieldTypeDescription
dressCodestringDress code requirements for guests
foodIncludedstringDescription of food included in the product
drinksIncludedstringDescription of drinks included in the product

MP+ Example (within a Product response)

MP+ fields within a Product response
{
  "product": {
    "id": "1fb7a9bc-3479-43a3-afe3-a788e508feba",
    "title": "San Francisco Bus Tour",

    // ... OCTO Core fields ...

    "confirmationNecessary": false,
    "category": "Tours & Sightseeing",
    "redemptionType": "voucher",
    "guideType": "Instructor",
    "tripDifficulty": "Easy",
    "emergencyPhone": "+1-555-911-0000",
    "bookingMinPax": 1,
    "bookingMaxPax": 15,
    "maxGroupSize": 15,
    "ageRestrictionType": "MinAge",
    "ageRestrictionValue": 12,
    "dressCode": "Comfortable shoes and clothes",
    "foodIncluded": "Snacks available for purchase. Breakfast included.",
    "drinksIncluded": "Soft drinks or tea. Alcoholic drinks available for purchase."
  }
}

Content Feed API

The Content Feed API provides optimised endpoints for retrieving complete account and product data in bulk. Instead of fetching individual resources one by one, you can retrieve multiple accounts or products in a single request, in your preferred format.

This is ideal for populating or syncing a product catalogue, feeding data into a CMS, search index, or AI system, generating documentation or reports, and bulk data exports for analytics.

Authentication

The Content Feed API currently uses the same API key as OCTO Core and MP+ endpoints, provided via the X-Api-Key header.

Note Authentication for the Content Feed API may move to a separate key in the future. Check this section for updates.

Get Accounts

Retrieve complete account data for one or more suppliers in a single request.

GET /api/content-feed/accounts

Query Parameters

ParameterDefaultDescription
account_idsoptionalComma-separated account IDs
formatjsonExport format (see Supported Formats)
content_typecompany_infocompany_info for basic data, all for full data including products and reviews
page1Page number for pagination
per_page50Items per page (max: 100)

Example Requests

Get company info (JSON)
GET /api/content-feed/accounts?content_type=company_info&account_ids=ID1,ID2
Host: magpie.travel
X-Api-Key: your_api_key_here
Get all data (JSON-LD format)
GET /api/content-feed/accounts?content_type=all&format=jsonld&account_ids=ID1
Host: magpie.travel
X-Api-Key: your_api_key_here
Get account data (Markdown)
GET /api/content-feed/accounts?content_type=company_info&format=markdown&account_ids=ID1
Host: magpie.travel
X-Api-Key: your_api_key_here

Example Response (JSON)

200 OK — application/json
{
  "accounts": [
    {
      "id": "YOUR_ACCOUNT_ID",
      "name": "Account Name",
      "telephone": "+33 1 23 45 67 89",
      "website": "https://ophorus.com",
      "description": "Premium tour operator in France",
      "category": "Operator",
      "email": "[email protected]",
      "locale": "en",
      "timeZone": "Europe/Paris",
      "logo": "https://example.com/logo.png",
      "reviewRating": "4.8",
      "reviewCount": 245,
      "bookingSystemsId": ["Ventrata", "Viator"],
      "media": [],
      "locations": [],
      "products": [],
      "faqs": [],
      "reviews": []
    }
  ],
  "paginate": {
    "total_accounts": 1250,
    "total_pages": 25,
    "per_page": 50,
    "from": 1,
    "to": 50,
    "current_page_url": "/api/content-feed/accounts?page=1",
    "next_page_url": "/api/content-feed/accounts?page=2",
    "prev_page_url": ""
  },
  "count": 50
}

Example Response (Markdown)

200 OK — application/json
{
  "format": "markdown",
  "content": "# Account: Ophorus Tours in France\n\n## Company Information\n...",
  "count": 1
}

Get Products

Retrieve complete product data for one or more products in a single request.

GET /api/content-feed/products

Query Parameters

ParameterDefaultDescription
product_idsoptionalComma-separated product IDs
version_typePrimaryFilter by version type (e.g., Primary, Language, Website,..)
version_namenoneFilter by specific version name
formatjsonExport format (see Supported Formats)
page1Page number for pagination
per_page20Items per page (max: 100)

Example Request

Get multiple products (JSON)
GET /api/content-feed/products?product_ids=ID1,ID2
Host: magpie.travel
X-Api-Key: your_api_key_here

Example Response

200 OK — application/json
{
  "accounts": [
    {
      "id": "YOUR_ACCOUNT_ID",
      "name": "Adventure Tours Co",
      "username": "adventure-tours-co",
      "website": "https://adventuretours.com",
      "products": [
        {
          "id": "YOUR_PRODUCT_ID",
          "title": "Alsace Christmas Markets Private Tour",
          "shortDescription": "Visit Christmas markets in beautiful Alsatian villages",
          "category": "Tours & Sightseeing",
          "duration": "7 hours",
          "currency": "EUR",
          "media": []
        }
      ]
    }
  ],
  "count": 1,
  "paginate": {
    "total_products": 15420,
    "total_pages": 772,
    "current_page": 1,
    "per_page": 20,
    "actual_count": 1,
    "next_page": 2,
    "prev_page": null
  }
}
Note on response structure Products are returned nested inside an accounts array, grouped by the account they belong to. When processing the response, iterate through accounts[].products[] to access individual products.

Supported Formats

Both endpoints accept a format parameter. The response Content-Type is always application/json — for non-JSON formats, the formatted content is returned inside a content string field.

FormatDescriptionBest for
jsonStandard JSONWeb APIs, general integration
jsonlNewline-delimited JSONStreaming, bulk processing, LLM ingestion
jsonldSchema.org JSON-LDSEO, structured data, semantic web
json-octoOCTO Core specification formatTourism industry systems (Accounts only)
markdownHuman-readable MarkdownDocumentation, reports, AI context
textPlain textEmail, simple text systems
Format availability The json-octo format is currently only available for the Accounts endpoint.

Caching

The Content Feed API uses intelligent caching to deliver faster responses. Responses are cached for up to 60 minutes and automatically invalidate when data is modified through the Magpie dashboard or API. If a cache refresh fails, stale data (up to 24 hours old) is served to ensure availability.

Error Handling

CodeResponseCause
400{"error": "No account IDs provided"}Missing required ID parameter
400{"error": "Invalid format..."}Unsupported format value
400{"error": "Invalid content_type..."}Unsupported content_type (accounts only)
401UnauthorizedMissing or invalid API key
404{"error": "No accounts found"}No matching records for the given IDs
500Server errorInternal error — retry with exponential backoff