{
  "markdown": "<p align=\"center\">\n  <img src=\"assets/mspace-logo.png\" width=\"220\" alt=\"mSpace — Connect. Interact. Engage.\">\n</p>\n\n<h1 align=\"center\">mSpace Skill for Agents</h1>\n\n<p align=\"center\">\n  <em>Telco integrations your AI agent gets right the first time.</em>\n</p>\n\n<p align=\"center\">\n  <sub>by <strong>hSenid Mobile Solutions</strong> for <strong>mSpace</strong></sub>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/hSenidMobileCPaaS/mSpace-as-a-skill/actions/workflows/ci.yml\"><img src=\"https://img.shields.io/github/actions/workflow/status/hSenidMobileCPaaS/mSpace-as-a-skill/ci.yml?branch=main&style=flat-square&label=CI&color=1A9940\" alt=\"CI status\"></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/licence-proprietary-1A9940?style=flat-square\" alt=\"Proprietary licence\"></a>\n  <img src=\"https://img.shields.io/badge/endpoints-18-1A9940?style=flat-square\" alt=\"18 endpoints\">\n  <img src=\"https://img.shields.io/badge/callbacks-5-1A9940?style=flat-square\" alt=\"5 callbacks\">\n  <img src=\"https://img.shields.io/badge/status%20codes-50%2B-1A9940?style=flat-square\" alt=\"50+ status codes\">\n  <img src=\"https://img.shields.io/badge/works%20with-20%2B%20agents-1A9940?style=flat-square\" alt=\"Works with 20+ agents\">\n  <img src=\"https://img.shields.io/badge/dependencies-0-1A9940?style=flat-square\" alt=\"Zero dependencies\">\n</p>\n\n<p align=\"center\">\n  <strong>SMS · USSD · Subscription · OTP · CaaS charging · LBS</strong><br>\n  <sub>Mobitel's Sri Lankan application platform — the Inzpire API track.</sub>\n</p>\n\n---\n\nAsk an AI agent to integrate mSpace today and it will confidently write\n`if (response.ok) return \"sent\"`. mSpace returns **HTTP 200 for failures**, so that line reports\nevery error as a success.\n\nThen it will write `if (statusCode === \"S1000\")` — and break charging, because a successful mSpace\ncharge request answers **`P1003`**, not `S1000`. It will read `statusDetail` on the one endpoint\nthat returns `statusDescription`. It will treat `POST /caas/direct/debit` as *the* charge, when it\nonly sends an OTP and the money moves on a second call. And if you let it near a retry, it will\nre-roll `externalTrxId` after a timeout and charge someone twice.\n\nNone of that is the model being careless. It is the model not having the contract.\n\nThis repo gives it the contract: every endpoint, every parameter, every response field, every\npublished status code, all five callbacks, and the handful of rules that separate a working\nintegration from a suspended one.\n\n**In whatever language you already use.** mSpace is JSON over HTTPS, so nothing here is tied to one\nruntime:\n\n- [**Every endpoint as a runnable curl**](references/14-curl-reference.md) — the request, every\n  parameter defined, the response, every response field explained, and the same for every callback.\n  Translate it into the HTTP client you already use and you have the call. No SDK, no generated\n  code, no language second-class.\n- [**references/12-any-stack.md**](references/12-any-stack.md) specifies the integration around the\n  calls language-neutrally — seven components, per-language notes, and an acceptance checklist —\n  for Ruby, Rust, Kotlin, Elixir or anything else.\n- [**templates/**](templates/README.md) shows the whole thing already built in TypeScript/Node,\n  Python, Java, Go, PHP and C# — worked examples to read for shape, not output to paste.\n\nThere is deliberately **no code generator**. An emitter serves the languages someone wrote emitters\nfor and ages with each of their idioms; a curl is the same call everywhere and stays true as long\nas the contract does.\n\n---\n\n## Install\n\nPick your agent. Everything below is the same content behind a different filename.\n\n<details open>\n<summary><strong>Claude Code</strong></summary>\n\n```\n/plugin marketplace add hSenidMobileCPaaS/mSpace-as-a-skill\n```\n```\n/plugin install mspace@mspace\n```\n\nOr clone it as a skill directly:\n\n```bash\ngit clone https://github.com/hSenidMobileCPaaS/mSpace-as-a-skill ~/.claude/skills/mspace\n```\n</details>\n\n<details>\n<summary><strong>Cursor</strong></summary>\n\n```bash\ngit clone https://github.com/hSenidMobileCPaaS/mSpace-as-a-skill .mspace\ncp .mspace/.cursor/rules/mspace.mdc .cursor/rules/\n```\n</details>\n\n<details>\n<summary><strong>Codex</strong></summary>\n\n```bash\ncodex plugin marketplace add hSenidMobileCPaaS/mSpace-as-a-skill\ncodex plugin add mspace@mspace\n```\n</details>\n\n<details>\n<summary><strong>GitHub Copilot</strong></summary>\n\nCLI:\n\n```bash\ncopilot plugin marketplace add hSenidMobileCPaaS/mSpace-as-a-skill\n```\n\nEditor extension — copy the instructions file:\n\n```bash\ncp .mspace/.github/copilot-instructions.md .github/\n```\n</details>\n\n<details>\n<summary><strong>Gemini CLI / Antigravity</strong></summary>\n\n```bash\ngemini extensions install https://github.com/hSenidMobileCPaaS/mSpace-as-a-skill\n```\n</details>\n\n<details>\n<summary><strong>Windsurf · Cline · Kiro · Qoder</strong></summary>\n\n```bash\ngit clone https://github.com/hSenidMobileCPaaS/mSpace-as-a-skill .mspace\ncp .mspace/.windsurf/rules/mspace.md  .windsurf/rules/     # Windsurf\ncp .mspace/.clinerules/mspace.md      .clinerules/         # Cline\ncp .mspace/.kiro/steering/mspace.md   .kiro/steering/      # Kiro\ncp .mspace/.qoder/rules/mspace.md     .qoder/rules/        # Qoder\n```\n</details>\n\n<details>\n<summary><strong>Aider · Zed · Amp · Jules · Junie · OpenCode · anything reading AGENTS.md</strong></summary>\n\n```bash\ngit clone https://github.com/hSenidMobileCPaaS/mSpace-as-a-skill .mspace\n```\n\nThen reference `.mspace/AGENTS.md` from your own `AGENTS.md`, or copy it to the project root.\n</details>\n\n<details>\n<summary><strong>No install — any assistant</strong></summary>\n\nPaste the raw URL and ask it to read the file:\n\n```\nhttps://raw.githubusercontent.com/hSenidMobileCPaaS/mSpace-as-a-skill/main/AGENTS.md\n```\n</details>\n\nFull matrix of what each agent reads: **[docs/agent-support.md](docs/agent-support.md)**.\n\n---\n\n## The part that makes it precise\n\nDocumentation alone still leaves an agent recalling parameter names from memory. So the whole\nmSpace contract also ships as **structured data** — [`catalog/mspace-api.json`](catalog/mspace-api.json) —\nwith a zero-dependency CLI over it that any agent can drive through its shell.\n\nThis is the capability an MCP server would give you, without running a server: no install, no\ndependencies, no process to keep alive, and it works in every agent that can run a command.\n\n```bash\n$ node tools/mspace.mjs show subscription-query-base\n\nQuery Base (subscriber base size)  (subscription-query-base)\nReturn the number of subscribers currently registered to the application.\n\n  Endpoint  POST https://api.mspace.lk/subscription/query-base\n  Variable  MSPACE_SUBSCRIPTION_QUERY_BASE_URL\n\n  Request parameters\n    applicationId   string   required\n      Identifies the application. A unique identifier generated while provisioning.\n    password        string   required\n      Authenticates the application-originated message against the credentials of\n      the service provider.\n\n  Response fields\n    baseSize        Number of registered users. Arrives as a string — coerce it\n                    before arithmetic.\n    ...\n```\n\n| Command | Answers |\n|---|---|\n| `list [category]` | What services exist? |\n| `show <id>` | What exactly does this call take and return? |\n| `search \"<query>\"` | Which service does the thing I want? |\n| `curl <id> [k=v]` | **Give me the call** — a runnable request, with the parameters and the response defined. |\n| `validate <id> '<json>'` | Is this payload correct? |\n| `code <statusCode>` | What does this code mean, and what do I do? |\n| `diagnose \"<symptom>\"` | Why is this not working? |\n| `practices [severity]` | What must I not get wrong? |\n| `checklist` | Am I ready for production? |\n| `reference <doc>` | Show me the full guide. |\n| `platform` | Base URL, tracks, operator, conventions. |\n\nAdd `--json` to any command for machine-readable output. Agents that cannot run commands — or\nmachines without Node — read the catalog JSON directly; same data, and `jq` or a one-line Python\nsnippet gets at it. The CLI is a documentation reader: it makes no network calls, never sees a\ncredential, and puts no constraint on the language your integration is written in.\n\nIt catches the real mistakes, not just missing fields:\n\n```bash\n$ node tools/mspace.mjs validate sms-send '{\"message\":\"hi\",\"destinationAddresses\":\"tel:94702725777\"}'\n\n  ✗ 4 error(s)  against sms-send\n    ✗ Missing required field \"version\" — API version, numbered 1.0, 2.0 and so on…\n    ✗ Missing required field \"applicationId\" — Identifies the application…\n    ✗ Missing required field \"password\" — Authenticates the application-originated message…\n    ✗ \"destinationAddresses\" must be an ARRAY, got string. This is the most common\n      mSpace integration bug.\n```\n\nAnd it tells you which code means success on which call:\n\n```bash\n$ node tools/mspace.mjs code P1003\n\n  P1003  pending\n  Successfully sent OTP to user.\n\n  Retry   no\n  Action  This is the success code for CaaS OTP generation — nothing has been charged\n          yet. Store requestCorrelator, collect the OTP from the subscriber, and call\n          CaaS OTP Verification.\n  Success  This is the documented success outcome for: caas-otp-generation\n```\n\n### Every endpoint as curl — the path for any language\n\nNo SDK, no code generation, no Node: [references/14-curl-reference.md](references/14-curl-reference.md)\nwrites out all 14 endpoints and all 4 published callbacks at the wire — the request, every\nparameter defined, the response, every response field explained, and the status codes that endpoint\ncan return.\n\n```bash\ncurl -sS -X POST \"$MSPACE_CAAS_DEBIT_URL\" \\\n  -H 'Content-Type: application/json;charset=utf-8' \\\n  --max-time 15 \\\n  -d @- <<REQUEST\n{\n  \"applicationId\": \"$MSPACE_APP_ID\",\n  \"password\": \"$MSPACE_PASSWORD\",\n  \"externalTrxId\": \"256091232\",\n  \"subscriberId\": \"tel:94702725777\",\n  \"paymentInstrumentName\": \"Mobile Account\",\n  \"amount\": \"5.00\",\n  \"currency\": \"LKR\"\n}\nREQUEST\n```\n\n| `externalTrxId` | **Required** | Your transaction ID, generated to map the request to the response. Persist it BEFORE calling — it is the idempotency key. |\n|---|---|---|\n| `paymentInstrumentName` | **Required** | The name of the payment instrument. Value: `Mobile Account`. |\n| `amount` | **Required** | Amount to be reserved for charging, sent as a string. Hold it as a decimal type in your own code. |\n\nCredentials come from the environment, so nothing on the page is a secret and nothing you copy can\ncommit one. The document is generated from the catalog and CI fails if it drifts, so a Ruby, Rust,\nKotlin or Elixir integration works from exactly the same contract as a TypeScript one — and running\na call by hand is the fastest way to tell a bad payload from bad code.\n\n### Why there is no code generator\n\nA generator encodes *idiom*, not contract: the mSpace contract barely moves, but framework\nversions, HTTP-client conventions and language idioms move constantly, so the emitter would carry\nmost of the maintenance while the contract carries most of the value. It also draws an arbitrary\nline — the seventh language is a second-class citizen forever.\n\nThe curl reference has neither problem. It is generated from the catalog, verified in CI, and\nequally correct for Kotlin, Elixir and Rust as for TypeScript. Modern coding agents write better\nclient code from a precise contract and a set of rules than any template can, because they write in\nthe host project's actual conventions.\n\nWhat is kept current instead: the catalog, the curl reference, the status-code semantics, the\npractices, and the diagnostics.\n\nAnd it turns a symptom into a fix:\n\n```bash\n$ node tools/mspace.mjs diagnose \"every charge fails but the user gets an OTP\"\n\n  Likely cause\n  CaaS charging on mSpace is two calls, not one. POST /caas/direct/debit only generates\n  an OTP and answers P1003; the money moves when the subscriber's OTP is verified with\n  POST /caas/otp/verify, and the final outcome arrives on the charging notification.\n\n  Fix\n  Treat P1003 as success for the generation step, store requestCorrelator, collect the\n  OTP, then call CaaS OTP Verification with referenceNo = requestCorrelator. Settle the\n  transaction from the charging notification. See references/06-caas.md.\n```\n\n---\n\n## Configuration is two credentials and your enabled endpoints\n\nAn mSpace application can only call the APIs it was provisioned for, so the configuration mirrors\nthat exactly — nothing else is environment-dependent:\n\n```bash\nMSPACE_APP_ID=APP_XXXXXX\nMSPACE_PASSWORD=replace-me\n\n# Uncomment only what is enabled on your application:\n#MSPACE_SMS_SEND_URL=https://api.mspace.lk/sms/send\n#MSPACE_SUBSCRIPTION_SEND_URL=https://api.mspace.lk/subscription/send\n#MSPACE_CAAS_DEBIT_URL=https://api.mspace.lk/caas/direct/debit\n#MSPACE_CAAS_OTP_VERIFY_URL=https://api.mspace.lk/caas/otp/verify\n```\n\nAn unset endpoint is meaningful: the client refuses the call locally, so you get a clear error\nnaming the missing variable instead of `E1309` from the platform after a round trip. Pointing one\nat the mSpace simulator from the developer bundle is the whole local-development switch.\n\nTimeouts, encodings and retry policy are **not** configuration — they are constants in the client,\nbecause they are properties of the protocol rather than of your deployment.\n\nThese variable names are identical across every language template, so a polyglot estate has one\ndeployment story.\n\n## Architecture it steers agents toward\n\n<p align=\"center\">\n  <img src=\"assets/architecture.svg\" width=\"860\" alt=\"A browser or mobile client calls your backend; your backend holds the credentials and calls mSpace over HTTPS from a static allowed host address; mSpace reaches subscribers on Mobitel and posts callbacks back to your backend. Credentials never cross the trust boundary to the client.\">\n</p>\n\n---\n\n## Coverage\n\nAll six APIs mSpace publishes on its [Inzpire services page](https://mspace.lk/serviceInzpire.html),\none reference document each:\n\n| Inzpire API | Operations | Reference |\n|---|---|---|\n| **SMS API** | Send (MT), send to the subscribed base (`tel:all`), receive (MO), delivery status reports | [02-sms](references/02-sms.md) |\n| **USSD API** | Send screens, receive input, the `mo-init`/`mo-cont`/`mt-init`/`mt-cont`/`mt-fin` state machine | [03-ussd](references/03-ussd.md) |\n| **Subscription API** | Register (opt-in), **unregister (opt-out)**, subscriber status, **query base size**, subscriber charging info (up to 10 at a time), paged subscriber list, subscriber notifications | [04-subscription](references/04-subscription.md) |\n| **OTP API** | Request, verify, masked-MSISDN handoff — activating a subscription from a web or app sign-up | [05-otp](references/05-otp.md) |\n| **CaaS API** | The three-step OTP-authorised charge: generation (`P1003`), verification (the money moves), charging notification (settlement) | [06-caas](references/06-caas.md) |\n| **LBS API** | Request a subscriber's location, with `requesterId` and `subscriberId` as separate fields | [07-lbs](references/07-lbs.md) |\n| **Not published** | Voice/IVR, and the balance retrieval the CaaS blurb mentions — documented as absent, with no invented endpoints | [06-caas](references/06-caas.md) |\n\nThe **Xpand** track — no-code Contact, Vote, Alert and Scheduled Messages applications — is\ndescribed so an agent can tell a user when a template beats an integration.\n\n### Languages\n\n| Stack | What ships |\n|---|---|\n| TypeScript / Node | config, client, types, Next.js callback routes, USSD session store |\n| Python | config, client, FastAPI callbacks, USSD session store (standard library only) |\n| Java | config, client, Spring callback controller |\n| Go | config, client, `net/http` callbacks (standard library only) |\n| PHP | config, client, framework-neutral callbacks with Laravel notes |\n| C# / .NET | options, typed client, ASP.NET Core callbacks + background worker |\n| Anything else | [references/14-curl-reference.md](references/14-curl-reference.md) — every endpoint as curl, with definitions — plus [references/12-any-stack.md](references/12-any-stack.md) for the seven components, per-language notes and an acceptance checklist |\n\nPlus the complete published status-code table, every callback contract, and the operational\npractices that keep an application approved.\n\n### Skills\n\n| Skill | Use it for |\n|---|---|\n| `mspace` | General mSpace work; the rules and the service map |\n| `mspace-scaffold` | Starting a new integration |\n| `mspace-callbacks` | Inbound webhooks |\n| `mspace-review` | Auditing existing code |\n| `mspace-debug` | A failing call or callback |\n| `mspace-golive` | The pre-production checklist |\n| `mspace-help` | Quick reference |\n\nOn plugin-tier hosts these are also slash commands: `/mspace`, `/mspace-review`, and so on.\n\n---\n\n## What it actually changes\n\nFourteen mistakes agents make on this platform, and what each one costs:\n\n| Mistake | Consequence |\n|---|---|\n| Deciding on the HTTP status (`res.ok`, `raise_for_status()`, `EnsureSuccessStatusCode()`) | mSpace returns **HTTP 200 for errors**. Every failure reported as a success. |\n| `statusCode === \"S1000\"` as the only success | Every successful charge request (**`P1003`**) reported as a failure, and an empty subscriber base (**`S1001`**) as a broken integration. |\n| Reading only `statusDetail` | CaaS OTP verification returns `statusDescription`. The one call that took someone's money is the one with no message. |\n| Treating `/caas/direct/debit` as the charge | It only sends an OTP. Nothing is charged until `/caas/otp/verify`, and nothing is settled until the notification. |\n| `externalTrxId` sent as `referenceNo` on verification | `E1855` on every confirmation. It wants the `requestCorrelator`. |\n| Charge retried with a fresh `externalTrxId` | **Can charge a real person twice.** |\n| `destinationAddresses: \"tel:94…\"` | It is always an **array**. Sends fail. |\n| `version` omitted on SMS Send or USSD Send | Mandatory on both. |\n| Subscription status treated as two-valued | Six statuses. `INITIAL`, `REG_PENDING` and `TEMPORARY_BLOCKED` are live subscribers in trouble, not absent ones. |\n| Hardcoded `applicationId` / `password` | A credential that can charge your subscribers, committed to git. |\n| LBS `requesterId` and `subscriberId` swapped | Locates the wrong person. |\n| Self-generated USSD `sessionId` | Sessions orphan; the subscriber's screen goes blank. |\n| USSD sessions in an in-process map, whatever the language | Works in dev, breaks the moment you scale. |\n| Work before acknowledging a callback | Sessions time out, duplicates pile up, and an unparseable response comes back as `E1607`. |\n| TLS verification switched off (`rejectUnauthorized: false`, `verify=False`, `InsecureSkipVerify`, …) | Your credentials become interceptable. |\n\n---\n\n## Quick start\n\n```bash\n# 1. Configure\ncp templates/.env.example .env\n$EDITOR .env                       # credentials, then uncomment ONLY the endpoints\n                                   # for the APIs enabled on your application\n\n# 2. Confirm the egress IP of the server that will call mSpace is listed under\n#    Allowed Host Address on the application record — determine it ON THAT SERVER\n\n# 3. Verify connectivity and credentials\n./scripts/smoke-test.sh            # Windows: .\\scripts\\smoke-test.ps1\n\n# 4. Test your callback handlers — no mSpace account needed\n./scripts/test-callbacks.sh http://localhost:3000\n```\n\nNo account yet? The mSpace developer bundle ships a **local simulator** — extract it, run\n`sdp-simulator.bat console` (or `sh sdp-simulator console`), open `http://localhost:10001/`, and\npoint your `MSPACE_*_URL` variables at it. Needs Java 1.6.0 or above.\n\nThen ask your agent:\n\n> Add mSpace subscription and SMS to this app — subscribers opt in by SMS keyword, get a welcome\n> message, and can text STOP to unsubscribe.\n\nStarting from nothing, mid-build, or bolting mSpace onto an app that already has users? The A-to-Z\nroute for each is [references/13-implementation-playbook.md](references/13-implementation-playbook.md).\n\n---\n\n## What's inside\n\n```\nSKILL.md · AGENTS.md              Entry points (Claude Code / everyone else)\ncatalog/mspace-api.json           The whole contract as structured data\ntools/mspace.mjs                  Offline CLI over the catalog\nreferences/                       14 guides: one per Inzpire API (SMS, USSD, Subscription, OTP,\n                                  CaaS, LBS), then callbacks, codes, security, go-live, the\n                                  language-neutral spec, the A-to-Z playbook, and every endpoint\n                                  as curl with its definitions\ntemplates/                        .env.example + working config, client and callback handlers\n                                  in TypeScript/Node, Python, Java, Go, PHP and C#\nskills/ · commands/               7 task skills and their slash commands\nscripts/                          Smoke tests (bash + PowerShell), callback tests, rule sync,\n                                  curl-reference build\ndocs/agent-support.md             Which agent reads which file\n```\n\n---\n\n## Development\n\n```bash\nnpm test                                     # catalog + tooling tests\nnpm run check                                # tests + everything generated is in sync\nnode scripts/sync-rules.mjs                  # regenerate the agent rule copies\nnode scripts/build-curl-reference.mjs        # regenerate the curl reference\n```\n\nTwo things are generated and CI fails if they drift: the seven agent rule files, from `AGENTS.md`,\nand `references/14-curl-reference.md`, from `catalog/mspace-api.json`. The test suite verifies that\nevery referenced status code exists, every parameter is fully specified, every documented sample\nvalidates against its own schema, every endpoint and parameter appears in the curl reference, and\nno credential-shaped string is committed.\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). Corrections to the API contract are the most valuable\ncontribution — cite the documentation page or paste the observed response.\n\n---\n\n## Sources\n\nEverything derives from the official mSpace documentation:\n\n- <https://mspace.lk/API_Documentation/mobitel_tap_api.html> — the API reference\n- <https://mspace.lk/API_Documentation/openapi.json> — the machine-readable specification\n- <https://mspace.lk/serviceInzpire.html> · <https://mspace.lk/serviceXpand.html> — the two tracks\n- <https://mspace.lk/inzpire_tutorial.html> — application provisioning\n- <https://mspace.lk/prerequisite.html> · <https://mspace.lk/simulator_tutorial.html> — the\n  developer bundle and simulator\n\n**Nothing in this repo is invented.** Where mSpace publishes no status-code table for an endpoint,\nthis skill says so rather than borrowing a neighbouring endpoint's. Where the documentation gives a\ncode two meanings — `E1856` and `E1857` both do — both are recorded, with the endpoint each applies\nto. Where a schema exists with no endpoint path (`queryBalance`), that is stated as unavailable\nrather than turned into a URL.\n\nmSpace evolves. Confirm with the platform what your application is actually provisioned for before\ngo-live, and open an issue if the behaviour moves.\n\n## Support\n\n- **Platform** — <https://mspace.lk>\n- **Operator** — <https://www.mobitel.lk/mspace>\n\nQuote your `requestId` / `externalTrxId` / `internalTrxId` / `sessionId` and the `statusCode` —\nthat is what a trace is built from.\n\n## Security\n\nNo secrets in this repo; every credential is a placeholder and CI enforces it. The CLI makes no\nnetwork calls and never reads your credentials. See [SECURITY.md](SECURITY.md), and read\n`scripts/smoke-test.*` before running it — `--with-charge` starts a real charge.\n\n## Licence\n\n**Proprietary.** Copyright © 2026 hSenid Mobile Solutions (Pvt) Ltd. All rights reserved.\n\nThis skill is the sole property of hSenid Mobile Solutions and is licensed for **use only**. See\n[LICENSE](LICENSE) for the full terms.\n\n| | |\n|---|---|\n| ✅ You may | Install it into your AI coding assistant and use it, unmodified, to build and operate your own mSpace integrations. The integration code you produce is yours. |\n| ❌ You may not | Copy it beyond what installation requires, modify it, publish or redistribute it, mirror or fork it, sublicense it, sell it, or bundle it into anything you sell. |\n\n**mSpace**, **Inzpire**, **Xpand**, **Mobitel**, **hSenid Mobile** and their logos are trademarks\nof their respective owners. You may refer to mSpace by name when describing an integration you have\nbuilt; you may not use the marks in your own product, service or marketing.\n\nFor any permission beyond this — including modifying, redistributing or embedding the skill —\ncontact hSenid Mobile Solutions.\n\n---\n\n<p align=\"center\">\n  <a href=\"https://www.hsenidmobile.com\">\n    <img src=\"assets/hsenid-logo.png\" width=\"240\" alt=\"hSenid Mobile — co-creating the future\">\n  </a>\n</p>\n\n<p align=\"center\">\n  <sub>Built by <a href=\"https://www.hsenidmobile.com\">hSenid Mobile Solutions</a> for\n  <a href=\"https://mspace.lk\">mSpace</a>.</sub><br>\n  <sub>The platform evolves — verify anything security- or billing-critical against\n  <a href=\"https://mspace.lk/API_Documentation/mobitel_tap_api.html\">the mSpace API documentation</a>\n  before going live.</sub>\n</p>\n",
  "bytes": 25281,
  "sha": "a94643855415caed1ef856db53a53d437eb282a2e392c92a8723f837a2aba6ce",
  "repo_slug": "hsenidmobilecpaas/mspace-as-a-skill",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_hsenidmobilecpaas_mspace_as_a_skill_6782a05a/readme"
}