RaceCap

API

REST API with prices of every store and region, history, alerts and webhooks

OpenAPI 3.1 Markdown API keys

Prices of nine stores (Steam, PlayStation Store, Xbox, Nintendo eShop, Epic Games Store, GOG, EA app, Ubisoft Store, Battle.net) in every regional storefront they sell in (/regions, /countries), with history, under one canonical game catalog.

Quick start

The API needs a plan with API access. Create a key in your account; it is shown once. Then:

curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/best?q=elden+ring&limit=5'

Authentication

Send the key in X-API-Key (or Authorization: Bearer <key>). The API is for servers and scripts: it sends no CORS headers.

Limits

Each plan sets requests a minute and a day, the largest limit and offset, the refresh priority, forced refreshes, watch slots and keys. GET /usage shows them and costs nothing. Answers carry X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset and the -Day variants. Over a budget the answer is 429 with Retry-After. A refused request (400, 429) costs nothing. POST /prices costs one request per item, a refresh stream one per region it checks.

Parameters

An unknown query parameter, or one given twice, is a 400 that names it. provider and country take any letter case.

Paging

Lists come in pages: pass next_offset as offset until it is null. Sync the whole catalog with /items and after.

Freshness

Every price carries seen_at. Viewing a product or a game starts a background refresh of regions older than about 30 minutes. max_age (seconds) asks for prices no older than that: older ones are read again first. max_age=0 on a refresh stream forces every region and spends a forced refresh.

Caching

GET answers carry a weak ETag and Cache-Control: private (60 s, 300 s for cards). Send it back in If-None-Match to get an empty 304.

Idempotency

POST /watch, POST /webhooks and webhook actions take an Idempotency-Key: the same key and body within 24 hours replays the first answer with Idempotent-Replayed: true.

Webhooks

Deliveries are POSTed JSON {id, type, created_at, data} signed with X-RaceCap-Signature: t=<unix>,v1=<hex HMAC-SHA256 of "t.body">. Failed deliveries retry with backoff (1 min to 12 h); a webhook failing 20 times in a row is disabled until resumed.

Errors

JSON {error, message}: 400 bad_request, 401 unauthorized or invalid_key, 403 subscription_required, 404 not_found, 409 watch_limit or too_many_webhooks, 410 gone, 415 unsupported_media_type, 422 no_prices or idempotency_mismatch, 429 rate_limited, 500 internal.

Data

Prices are read from each store's regional storefront by RaceCap's own scanner; exchange rates come from ExchangeRate-API daily.

GET /v1/best

Where each product costs least

Products matching a search, each with its cheapest region in USD

qquery, string, requiredSearch text
providerquery, stringStore: steam, psn, nintendo, epic, gog, ubisoft, xbox, ea, bnet
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
currencyquery, stringAlso convert prices to this currency (field "converted"); default USD only
limitquery, integerPage size (default 10, max 100)
offsetquery, integerItems to skip
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/best'
Example answer
{
  "items": [
    {
      "product": {
        "provider": "xbox",
        "product_id": "9P3J32CTXLRZ",
        "name": "ELDEN RING"
      },
      "cheapest": {
        "provider": "xbox",
        "product_id": "app:1245620",
        "region": "TR",
        "country": "TR",
        "currency": "USD",
        "price": "39.99",
        "base": null,
        "discount": null,
        "ends_at": null,
        "free": false,
        "preorder": false,
        "subscription_only": false,
        "plans": [],
        "usd": "39.99",
        "seen_at": "2026-10-16T15:49:49.994Z",
        "url": "https://store.steampowered.com/app/1245620/ELDEN_RING/?cc=tr"
      }
    }
  ],
  "next_offset": null
}

GET /v1/products

Search and filter products of every store

qquery, stringSearch text
providerquery, stringStore: steam, psn, nintendo, epic, gog, ubisoft, xbox, ea, bnet
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
kindquery, stringProduct kind
game · edition · bundle · dlc · currency · other
limitquery, integerPage size (default 20, max 100)
offsetquery, integerItems to skip
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/products'
Example answer
{
  "items": [
    {
      "provider": "steam",
      "product_id": "app:1245620",
      "name": "ELDEN RING",
      "kind": "game",
      "game_id": "elden-ring"
    }
  ],
  "next_offset": 20
}

GET /v1/products/{provider}/{product_id}

A store product with its prices

providerpath, string, requiredStore
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
product_idpath, string, requiredStore product id, e.g. app:1245620
regionquery, stringA region of the store (see /regions), e.g. TR
countryquery, stringISO 3166 country; the store region that serves it is used
currencyquery, stringAlso convert prices to this currency (field "converted"); default USD only
max_agequery, integerSeconds; older prices are read again first
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/products/steam/app:1245620'
Example answer
{
  "product": {
    "provider": "steam",
    "product_id": "app:1245620",
    "name": "ELDEN RING",
    "kind": "game",
    "game_id": "elden-ring"
  },
  "offers": [
    {
      "provider": "steam",
      "product_id": "app:1245620",
      "region": "TR",
      "country": "TR",
      "currency": "USD",
      "price": "39.99",
      "base": null,
      "discount": null,
      "ends_at": null,
      "free": false,
      "preorder": false,
      "subscription_only": false,
      "plans": [],
      "usd": "39.99",
      "seen_at": "2026-10-16T15:49:49.994Z",
      "url": "https://store.steampowered.com/app/1245620/ELDEN_RING/?cc=tr"
    }
  ]
}

GET /v1/products/{provider}/{product_id}/history

Price history of a product

providerpath, string, requiredStore
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
product_idpath, string, requiredStore product id
regionquery, string, requiredStore region
daysquery, integerWindow in days; default: the whole history the plan allows
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/products/steam/app:1245620/history'
Example answer
{
  "region": "TR",
  "currency": "USD",
  "points": [
    {
      "at": "2026-10-10T17:58:53Z",
      "price": "39.99",
      "base": null
    }
  ]
}

GET /v1/products/{provider}/{product_id}/info

What one store says about a product

providerpath, string, requiredStore
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
product_idpath, string, requiredStore product id
langquery, stringLanguage of texts
en · ru
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/products/steam/app:1245620/info'
Example answer
{
  "product": {
    "provider": "steam",
    "product_id": "app:1245620"
  },
  "facts": {
    "short": "THE CRITICALLY ACCLAIMED FANTASY ACTION RPG"
  }
}

GET /v1/products/{provider}/{product_id}/refresh

Refresh the prices of a product region by region, as a stream · costs nothing

NDJSON lines: queued, running, one per region, then done. Costs one request per region it checks. max_age=0 forces every region and spends a forced refresh instead

providerpath, string, requiredStore
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
product_idpath, string, requiredStore product id
regionsquery, csvComma separated regions; default every region of the store
max_agequery, integerSeconds; older prices are read again first
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/products/steam/app:1245620/refresh'
Example answer
{
  "kind": "region",
  "region": "TR",
  "ok": true,
  "offer": {
    "provider": "steam",
    "product_id": "app:1245620",
    "region": "TR",
    "country": "TR",
    "currency": "USD",
    "price": "39.99",
    "base": null,
    "discount": null,
    "ends_at": null,
    "free": false,
    "preorder": false,
    "subscription_only": false,
    "plans": [],
    "usd": "39.99",
    "seen_at": "2026-10-16T15:49:49.994Z",
    "url": "https://store.steampowered.com/app/1245620/ELDEN_RING/?cc=tr"
  }
}

GET /v1/products/{provider}/{product_id}/refresh/live

Watch the refresh of a product that is already running, as a stream

providerpath, string, requiredStore
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
product_idpath, string, requiredStore product id
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/products/steam/app:1245620/refresh/live'
Example answer
{
  "kind": "queued",
  "position": 1
}

POST /v1/prices

Prices of many products at once

Up to max_batch items; each costs one request. Items come back in request order with their offers or their own error

{"items": [{"provider", "product_id", "region"?, "country"?}], "max_age"?}

curl -X POST -H "X-API-Key: $KEY" -H 'Content-Type: application/json' -d '{"items":[{"provider":"steam","product_id":"app:1245620","country":"TR"},{"provider":"psn","product_id":"c:10006560","region":"US"}]}' 'https://racecap.soracrm.net/api/v1/prices'
Example answer
{
  "items": [
    {
      "provider": "steam",
      "product_id": "app:1245620",
      "offers": [
        {
          "provider": "steam",
          "product_id": "app:1245620",
          "region": "TR",
          "country": "TR",
          "currency": "USD",
          "price": "39.99",
          "base": null,
          "discount": null,
          "ends_at": null,
          "free": false,
          "preorder": false,
          "subscription_only": false,
          "plans": [],
          "usd": "39.99",
          "seen_at": "2026-10-16T15:49:49.994Z",
          "url": "https://store.steampowered.com/app/1245620/ELDEN_RING/?cc=tr"
        }
      ]
    }
  ]
}

GET /v1/lookup

Find products by a store link or id

qquery, string, requiredA store link or product id of any store
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/lookup'
Example answer
{
  "items": [
    {
      "provider": "steam",
      "product_id": "app:1245620",
      "name": "ELDEN RING",
      "game_id": "elden-ring"
    }
  ]
}

GET /v1/items

Every item with the product that stands for it

Catalog sync: walk with "after" set to the last item_id of the previous page

afterquery, stringitem_id to continue after
limitquery, integerPage size
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/items'
Example answer
{
  "items": [
    {
      "item_id": "elden-ring:game:base",
      "game_id": "elden-ring",
      "kind": "game",
      "name": "ELDEN RING",
      "products": [
        {
          "provider": "steam",
          "product_id": "app:1245620"
        }
      ]
    }
  ],
  "next_after": "elden-ring:game:base"
}

GET /v1/items/{item_id}/info

The card of one item: an edition, a DLC or a bundle

item_idpath, string, requiredItem id, e.g. elden-ring:game:base
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/items/elden-ring:game:base/info'
Example answer
{
  "item_id": "elden-ring:game:base",
  "game_id": "elden-ring",
  "kind": "game",
  "name": "ELDEN RING",
  "products": []
}

GET /v1/suggest

Suggestions while typing a search

qquery, string, requiredSearch text
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/suggest'
Example answer
{
  "games": [
    {
      "id": "elden-ring",
      "name": "ELDEN RING"
    }
  ],
  "entities": []
}

GET /v1/games

Search and list games

qquery, stringSearch text
limitquery, integerPage size (default 20, max 100)
offsetquery, integerItems to skip
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/games'
Example answer
{
  "items": [
    {
      "id": "elden-ring",
      "name": "ELDEN RING",
      "stores": [
        "psn",
        "steam",
        "xbox"
      ]
    }
  ],
  "next_offset": 20
}

GET /v1/games/info

Cards of up to 100 games at once

idsquery, csv, requiredComma separated game ids
langquery, stringLanguage of texts
en · ru
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/games/info'
Example answer
{
  "items": [
    {
      "id": "elden-ring",
      "name": "ELDEN RING",
      "info": {}
    }
  ]
}

GET /v1/games/info/changes

Feed of changed game cards

afterquery, stringCursor: the "next" of the previous page or an ISO time
limitquery, integerPage size
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/games/info/changes'
Example answer
{
  "items": [
    {
      "id": "elden-ring",
      "updated_at": "2026-10-16T12:00:00Z"
    }
  ],
  "next": "2026-10-16T12:00:00Z|elden-ring"
}

GET /v1/games/{id}

A game with its prices in every store

idpath, string, requiredGame id, e.g. elden-ring
countryquery, stringISO 3166 country; the store region that serves it is used
currencyquery, stringAlso convert prices to this currency (field "converted"); default USD only
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/games/elden-ring'
Example answer
{
  "game": {
    "id": "elden-ring",
    "name": "ELDEN RING"
  },
  "stores": [
    {
      "provider": "steam",
      "products": [
        "app:1245620"
      ],
      "cheapest": {
        "provider": "steam",
        "product_id": "app:1245620",
        "region": "TR",
        "country": "TR",
        "currency": "USD",
        "price": "39.99",
        "base": null,
        "discount": null,
        "ends_at": null,
        "free": false,
        "preorder": false,
        "subscription_only": false,
        "plans": [],
        "usd": "39.99",
        "seen_at": "2026-10-16T15:49:49.994Z",
        "url": "https://store.steampowered.com/app/1245620/ELDEN_RING/?cc=tr"
      },
      "offers": [
        {
          "provider": "steam",
          "product_id": "app:1245620",
          "region": "TR",
          "country": "TR",
          "currency": "USD",
          "price": "39.99",
          "base": null,
          "discount": null,
          "ends_at": null,
          "free": false,
          "preorder": false,
          "subscription_only": false,
          "plans": [],
          "usd": "39.99",
          "seen_at": "2026-10-16T15:49:49.994Z",
          "url": "https://store.steampowered.com/app/1245620/ELDEN_RING/?cc=tr"
        }
      ]
    }
  ]
}

GET /v1/games/{id}/cheapest

Where a game costs least

idpath, string, requiredGame id
currencyquery, stringAlso convert prices to this currency (field "converted"); default USD only
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/games/elden-ring/cheapest'
Example answer
{
  "items": [
    {
      "provider": "steam",
      "product_id": "app:1245620",
      "region": "TR",
      "country": "TR",
      "currency": "USD",
      "price": "39.99",
      "base": null,
      "discount": null,
      "ends_at": null,
      "free": false,
      "preorder": false,
      "subscription_only": false,
      "plans": [],
      "usd": "39.99",
      "seen_at": "2026-10-16T15:49:49.994Z",
      "url": "https://store.steampowered.com/app/1245620/ELDEN_RING/?cc=tr"
    }
  ]
}

GET /v1/games/{id}/history

Price history of a game

idpath, string, requiredGame id
providerquery, string, requiredStore: steam, psn, nintendo, epic, gog, ubisoft, xbox, ea, bnet
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
regionquery, string, requiredStore region
daysquery, integerWindow in days
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/games/elden-ring/history'
Example answer
{
  "provider": "steam",
  "region": "TR",
  "currency": "USD",
  "points": [
    {
      "at": "2026-10-10T17:58:53Z",
      "price": "39.99",
      "base": null
    }
  ]
}

GET /v1/games/{id}/info

The rich card of a game

idpath, string, requiredGame id
langquery, stringLanguage of texts
en · ru
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/games/elden-ring/info'
Example answer
{
  "id": "elden-ring",
  "name": "ELDEN RING",
  "stores": [
    "psn",
    "steam",
    "xbox"
  ],
  "facts": []
}

GET /v1/entities

Developers, publishers, franchises, genres and features

qquery, stringSearch text
kindquery, stringEntity kind
publisher · developer · franchise · genre · feature
limitquery, integerPage size (default 20, max 100)
offsetquery, integerItems to skip
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/entities'
Example answer
{
  "items": [
    {
      "id": "publisher:bandai-namco",
      "kind": "publisher",
      "name": "Bandai Namco Entertainment",
      "games": 120
    }
  ],
  "next_offset": null
}

GET /v1/deals

Discounts in a region or country

providerquery, stringStore: steam, psn, nintendo, epic, gog, ubisoft, xbox, ea, bnet
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
regionquery, stringA region of the store (see /regions), e.g. TR
countryquery, stringISO 3166 country; the store region that serves it is used
currencyquery, stringAlso convert prices to this currency (field "converted"); default USD only
kindquery, stringProducts to include
game · dlc · all
min_discountquery, integerMinimum discount percent
sortquery, stringOrder
discount · price · popular · ending
limitquery, integerPage size (default 20, max 100)
offsetquery, integerItems to skip
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/deals'
Example answer
{
  "items": [],
  "next_offset": null
}

GET /v1/price-drops

Price drops in a region or country

providerquery, stringStore: steam, psn, nintendo, epic, gog, ubisoft, xbox, ea, bnet
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
regionquery, stringA region of the store (see /regions), e.g. TR
countryquery, stringISO 3166 country; the store region that serves it is used
currencyquery, stringAlso convert prices to this currency (field "converted"); default USD only
kindquery, stringProducts to include
game · dlc · all
limitquery, integerPage size (default 20, max 100)
offsetquery, integerItems to skip
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/price-drops'
Example answer
{
  "items": [],
  "next_offset": null
}

GET /v1/new

New in a region or country

providerquery, stringStore: steam, psn, nintendo, epic, gog, ubisoft, xbox, ea, bnet
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
regionquery, stringA region of the store (see /regions), e.g. TR
countryquery, stringISO 3166 country; the store region that serves it is used
currencyquery, stringAlso convert prices to this currency (field "converted"); default USD only
kindquery, stringProducts to include
game · dlc · all
limitquery, integerPage size (default 20, max 100)
offsetquery, integerItems to skip
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/new'
Example answer
{
  "items": [],
  "next_offset": null
}

GET /v1/releases

Releases by date in a region or country

providerquery, stringStore: steam, psn, nintendo, epic, gog, ubisoft, xbox, ea, bnet
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
regionquery, stringA region of the store (see /regions), e.g. TR
countryquery, stringISO 3166 country; the store region that serves it is used
currencyquery, stringAlso convert prices to this currency (field "converted"); default USD only
kindquery, stringProducts to include
game · dlc · all
sortquery, stringOrder
date · popular
limitquery, integerPage size (default 20, max 100)
offsetquery, integerItems to skip
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/releases'
Example answer
{
  "items": [],
  "next_offset": null
}

GET /v1/providers

Stores

curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/providers'
Example answer
[
  {
    "id": "bnet",
    "name": "Battle.net",
    "regions": 4,
    "products": 376,
    "games": 242
  }
]

GET /v1/regions

Regions of every store

providerquery, stringStore: steam, psn, nintendo, epic, gog, ubisoft, xbox, ea, bnet
steam · psn · nintendo · epic · gog · ubisoft · xbox · ea · bnet
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/regions'
Example answer
[
  {
    "provider": "steam",
    "region": "TR",
    "country": "TR",
    "currency": "USD",
    "name": "Turkey & MENA, USD",
    "serves": [
      "BH",
      "DZ"
    ],
    "last_full": "2026-10-16T15:49:49Z",
    "offers": 250000
  }
]

GET /v1/countries

Countries and the store regions that serve them

curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/countries'
Example answer
[
  {
    "country": "TR",
    "name": "Türkiye",
    "currency": "TRY",
    "regions": {
      "steam": "TR",
      "psn": "TR"
    }
  }
]

GET /v1/rates

Exchange rates to US dollars

curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/rates'
Example answer
{
  "base": "USD",
  "date": "2026-10-16",
  "rates": {
    "EUR": 0.89165,
    "TRY": 41.56
  }
}

GET /v1/status

Data freshness

curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/status'
Example answer
{
  "providers": [
    {
      "provider": "steam",
      "name": "Steam",
      "last_full": "2026-10-16T15:49:49Z",
      "state": "ok"
    }
  ],
  "ready": true,
  "snapshot_at": "2026-10-16T17:55:01Z"
}

GET /v1/genres

Shared genres

curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/genres'
Example answer
[
  {
    "id": "genre:action",
    "name": "Action",
    "games": 5000
  }
]

GET /v1/features

Shared features

curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/features'
Example answer
[
  {
    "id": "feature:multiplayer",
    "name": "Multiplayer",
    "games": 3000
  }
]

GET /v1/usage

Your plan and what is left of it · costs nothing

curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/usage'
Example answer
{
  "plan": {
    "id": "api_starter",
    "name": "API Starter",
    "ends_at": "2026-11-16T00:00:00Z"
  },
  "requests": {
    "per_minute": 60,
    "per_day": 3000,
    "used_today": 12
  }
}

GET /v1/watch

Your watched products

limitquery, integerPage size (default 50, max 1000)
offsetquery, integerItems to skip
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/watch'
Example answer
{
  "items": [
    {
      "id": 1,
      "provider": "steam",
      "product_id": "app:1245620",
      "condition": {
        "type": "below",
        "amount": 3000,
        "currency": "USD"
      }
    }
  ],
  "next_offset": null
}

POST /v1/watch

Watch a product

{"provider", "product_id", "regions"?, "condition": {"type": "drop"|"below"|"discount"|"any", "amount"?, "currency"?, "percent"?}}

curl -X POST -H "X-API-Key: $KEY" -H 'Content-Type: application/json' -d '{"provider":"steam","product_id":"app:1245620","regions":["TR","AR"],"condition":{"type":"below","amount":"25.00","currency":"USD"}}' 'https://racecap.soracrm.net/api/v1/watch'
Example answer
{
  "id": 1,
  "provider": "steam",
  "product_id": "app:1245620"
}

GET /v1/watch/events

Fired conditions, oldest first

afterquery, integerEvent id to continue after
limitquery, integerPage size
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/watch/events'
Example answer
{
  "items": [
    {
      "id": 10,
      "type": "below",
      "created_at": "2026-10-16T10:00:00Z",
      "payload": {}
    }
  ],
  "next_after": 10
}

GET /v1/watch/{id}

One watched product

idpath, integer, requiredWatch id
curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/watch/1'
Example answer
{
  "id": 1
}

PATCH /v1/watch/{id}

Change regions, the condition or pause

idpath, integer, requiredWatch id

{"regions"?, "condition"?, "paused"?}

curl -X PATCH -H "X-API-Key: $KEY" -H 'Content-Type: application/json' -d '{"paused":true}' 'https://racecap.soracrm.net/api/v1/watch/1'
Example answer
{
  "id": 1,
  "paused": true
}

DELETE /v1/watch/{id}

Stop watching

idpath, integer, requiredWatch id
curl -X DELETE -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/watch/1'

GET /v1/webhooks

Your webhooks

curl -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/webhooks'
Example answer
[
  {
    "id": 1,
    "url": "https://example.com/hook",
    "disabled_at": null
  }
]

POST /v1/webhooks

Receive events by HTTPS

Deliveries are signed: X-RaceCap-Signature: t=<unix>,v1=hex(HMAC-SHA256(secret, "<t>.<body>"))

{"url"}

curl -X POST -H "X-API-Key: $KEY" -H 'Content-Type: application/json' -d '{"url":"https://example.com/hook"}' 'https://racecap.soracrm.net/api/v1/webhooks'
Example answer
{
  "id": 1,
  "url": "https://example.com/hook",
  "secret": "whsec_..."
}

DELETE /v1/webhooks/{id}

Delete a webhook

idpath, integer, requiredWebhook id
curl -X DELETE -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/webhooks/1'

POST /v1/webhooks/{id}/redeliver

Send events again or resume a disabled webhook

idpath, integer, requiredWebhook id

{"event_ids"?: [ids]} — without ids every failed delivery is sent again

curl -X POST -H "X-API-Key: $KEY" -H 'Content-Type: application/json' -d '{"event_ids":[10,11]}' 'https://racecap.soracrm.net/api/v1/webhooks/1/redeliver'
Example answer
{
  "queued": 2
}

POST /v1/webhooks/{id}/secret

Replace the signing secret

idpath, integer, requiredWebhook id
curl -X POST -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/webhooks/1/secret'
Example answer
{
  "id": 1,
  "secret": "whsec_..."
}

POST /v1/webhooks/{id}/test

Send a test call now

idpath, integer, requiredWebhook id
curl -X POST -H "X-API-Key: $KEY" 'https://racecap.soracrm.net/api/v1/webhooks/1/test'
Example answer
{
  "event_id": 12
}

Language and currency

Oguri CapRaceCap