Tangled Land
Tangled Land · Dashboard API

API & Integrations

Follow your games, upcoming rooms, Lotería tablas and recorded rewards.

Read-only dataJSON over HTTPSPersonal keys + public calls

Connect your account

  1. Sign in to your Tangled Land account and open key management. Regular accounts can manage their own key.
  2. Generate a personal read-only key and copy it when shown. If a key is already active, use your saved copy or coordinate replacement before revoking it.
  3. Connect the key to your trusted dashboard. Send it in the Authorization: Bearer YOUR_KEY header from your server.

Keep keys encrypted on the server. Do not place them in URLs, public pages, browser code, source control or shared documents. Revoke a key on the source site to stop future API reads; data already cached by a dashboard may remain until its private cache expires.

Generate or manage my key →

Available calls

Append a route below to this base URL:

https://tangledland.com/api/dashboard/v1

Expand a call to see its parameters, request and response. Examples use fictional data and may omit fields; they are not your account data or a live quote.

GET/mePersonal key

My profile

Connected account identity and read-only scope.

Parameters · None

Example request

curl --request GET \
  --url 'https://tangledland.com/api/dashboard/v1/me' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "id": 42,
  "username": "example_user",
  "display_name": "Example User",
  "scope": "dashboard:read",
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/game-statsPersonal key

My game stats

Joined and completed rooms, hosted rooms and Trivia answers. Hosted rooms are not games played.

Parameters · None

Example request

curl --request GET \
  --url 'https://tangledland.com/api/dashboard/v1/me/game-stats' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "summary": {
    "joined_games": 10,
    "completed_games": 8,
    "hosted_games": 3,
    "trivia_answers": 19,
    "trivia_correct": 12
  },
  "games": [
    {
      "game": "trivia",
      "joined_games": 10,
      "completed_games": 8,
      "best_recorded_score": "20000"
    }
  ],
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/schedulePublic · no key

Upcoming schedule

Upcoming game rooms with join links and UTC times.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://tangledland.com/api/dashboard/v1/schedule?page=1&per_page=6' \
  --header 'Accept: application/json'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "id": "ABC123",
      "title": "Trivia · ABC123",
      "game": {
        "name": "Trivia",
        "slug": "trivia"
      },
      "url": "https://tangledland.com/join?code=ABC123",
      "starts_at": "2026-11-05T12:00:00Z",
      "ends_at": null,
      "status": "scheduled",
      "timezone": "UTC"
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/registrationsPersonal key

My joined scheduled rooms

Previously joined scheduled rooms for the account. There is no separate advance-registration record.

Parameters · page: integer 1–10000; per_page: integer 1–50. scope: upcoming or all.

Example request

curl --request GET \
  --url 'https://tangledland.com/api/dashboard/v1/me/registrations?page=1&per_page=6&scope=upcoming' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "items": [],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 0,
    "total_pages": 0
  },
  "registration_model": "room_join",
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/tablasPersonal key

My Lotería tablas

Stored approvals and pending submissions, card IDs and last verification times.

Parameters · page: integer 1–10000; per_page: integer 1–50. card_ids excerpt shortened for illustration.

Example request

curl --request GET \
  --url 'https://tangledland.com/api/dashboard/v1/me/tablas?page=1&per_page=6' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "tabla_id": 69,
      "status": "approved",
      "ownership_source": "splot",
      "verified_at": "2026-11-05T12:00:00Z",
      "reviewed_at": "2026-11-05T12:00:00Z",
      "nft_url": "https://splot.io/example-tabla/",
      "card_ids": [
        1,
        2,
        3,
        4
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "summary": {
    "total": 1,
    "approved": 1,
    "pending": 0
  },
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/rewardsPersonal key

My rewards

Reward events with amounts and separate status totals.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://tangledland.com/api/dashboard/v1/me/rewards?page=1&per_page=6' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "id": 123,
      "amount_mlx": "1000",
      "reason": "trivia_final_score",
      "status": "sent",
      "transaction_id": null,
      "created_at": "2026-11-05T12:00:00Z",
      "room_code": "ABC123",
      "game": "trivia"
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "by_status": {
    "sent": {
      "amount_mlx": "1000",
      "count": 1
    }
  },
  "updated_at": "2026-11-05T12:00:00Z"
}

Parameters and limits

page: integer 1–10000; per_page: integer 1–50. Lists default to 12 items. Registrations accept scope=upcoming (default) or all. Personal keys have a soft limit of 120 requests per minute.

Amounts such as MLX and USD cents may be decimal strings. Preserve their precision instead of converting large values to floating-point numbers. Use the returned pagination totals. Times shown in examples are ISO 8601 UTC; display dates in the user’s timezone.

What the data means

Registrations are scheduled rooms you have joined, not advance signups. Hosting alone does not count. Tabla ownership is the last stored Splot verification. Only sent rewards are confirmed paid. Schedule covers game rooms; Jukebox has a separate calendar.

Response handling

HTTPMeaning
200Successful read. An empty items array can be a valid result.
400Invalid or out-of-range parameters.
401Missing, invalid or revoked personal key.
429Too many requests. Wait before retrying.
503Data or a required source service is temporarily unavailable. Do not replace this with zero.

Use the HTTP status for error handling. Error bodies vary by route. Keep cached personal data private and short-lived; handle missing values and empty lists.

Optional PHP client

The API works with any language that can make HTTPS requests. A WordPress PHP reference client and README are also available as a convenience.

Download PHP client and README ↓