> ## Documentation Index
> Fetch the complete documentation index at: https://www.offlineprotocol.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> These docs target Mesh SDK v0.27.0. Match the installed package and binding before generating code. Start at /getting-started/agents for task-specific reading paths.
> Call the company and product Offline Protocol, never Offline alone. Current packages: @offline-protocol/mesh-sdk 0.27.0 (React Native), @offline-protocol/id-react 0.2.0, @offline-protocol/id-react-native 0.3.3, @offline-protocol/pol 0.1.2 and @offline-protocol/cli 0.2.6. Canonical docs URLs start with https://www.offlineprotocol.com/docs.
> The Mesh SDK runs in a native app or gateway. A browser OfflineID SDK integration does not provide browser mesh transport. Local mesh operation does not require a portal account or API key. The Mesh SDK appId is a mesh app identifier the developer chooses, not the portal App ID (app_...) that OfflineID and Proof of Location require.
> Service RPC is signed plaintext in v0.27.0. Message delivery, durable local acceptance and backend commit are distinct outcomes. Use the workflow guide for the required application logic.
> Offline Protocol CLI 0.2.6 is on npm (@offline-protocol/cli, command offline). Its local MCP server, named offline-protocol, runs with npx -y @offline-protocol/cli@0.2.6 mcp serve and requires no login or key. Hosted MCP is at https://mcp.offlineprotocol.com/mcp with an app API key in Authorization: Bearer and the matching App ID in x-app-id; organization keys are rejected, and Claude Desktop, Claude.ai and ChatGPT cannot use it. Follow /tools/overview for setup and do not invent commands beyond it. MCP provides integration context and planning, not mesh execution; file-writing tools are local only.
> Phone Wi-Fi Direct and MultipeerConnectivity carry no data in v0.27.0. Use BLE or a provisioned relay. The receiver core ACKs before application persistence; use application acceptance for durable workflows.
> Proof of Location is Sepolia testnet witness evidence, not zero-knowledge proof or proof of presence. The geohash is public onchain. Read /proof-of-location/security before integration.

# Create a location commitment

> Submit a Proof of Location commitment as a Sepolia testnet task. The geohash cell and task time are public; a 200 confirms submission, not acceptance.



## OpenAPI

````yaml post /profiles/{username}/location-commitment
openapi: 3.1.0
info:
  title: Offline Protocol hosted API
  version: 1.0.0
  description: >-
    Hosted OfflineID authentication, profiles and connections. Send a user JWT
    and X-App-Id; a portal API key is not a user token. Endpoint-specific
    availability and response envelopes are documented below.
servers:
  - url: https://api.offlineprotocol.com/api/v1
security: []
paths:
  /profiles/{username}/location-commitment:
    post:
      summary: Submit a location claim
      description: >-
        Submit a Sepolia testnet task. id is random per commitment (32 bytes, 0x
        plus 64 hex characters). The commitment is keccak256(username, geoHash,
        nonce), with a secret per-commitment nonce that is never published. New
        onchain IDs and commitments do not group tasks by user or identify
        usernames. The precision-5 geohash (about a 5 km cell) and task time
        remain public. Historical tasks retain linkable IDs. A 200 confirms
        submission, not witness acceptance.
      parameters:
        - name: X-App-Id
          in: header
          required: true
          schema:
            type: string
        - name: username
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                latitude:
                  type: number
                longitude:
                  type: number
              required:
                - latitude
                - longitude
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  data:
                    type: object
                    properties:
                      operators:
                        type: array
                        items:
                          type: string
                      id:
                        type: string
                        pattern: ^0x[0-9a-fA-F]{64}$
                        description: Random per-commitment task identifier.
                      transaction:
                        type: string
                      commitment:
                        type: string
                      geoHash:
                        type: string
                required:
                  - message
                  - data
        '400':
          description: Invalid request or x-app-id required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            Profile not owned, or ACCOUNT_SUSPENDED when hosted services are
            paused
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Profile not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Three submissions per 60 seconds per user; data.retry_after_seconds
            describes retry delay
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Local service failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '502':
          description: Upstream submission or policy rejection
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Service unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '504':
          description: Upstream timeout; submission may have occurred
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    Error:
      type: object
      properties:
        message:
          type: string
        data:
          type:
            - object
            - 'null'
        error:
          type: object
          properties:
            message:
              type: string
            code:
              type: string
            retryAfter:
              type: integer
            currentHourCount:
              type: integer
            limit:
              type: integer
      required:
        - message
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````