Getting Started

Syncro Sender by P2P.ORG offers two access modes: a public endpoint that requires no API key (just include a tip in your transaction) and a private endpoint authenticated with an API key.

EndpointURLAuth MethodNotes
Publichttps://sfls.l2.p2p.org/public, https://sfls-geo-fra.l2.p2p.org/public, https://sfls-geo-nyc.l2.p2p.org/public, https://sfls-geo-lon.l2.p2p.org/public, https://sfls-geo-tky.l2.p2p.org/public, https://sfls-geo-sgp.l2.p2p.org/publicTip in transactionsendTransaction only
Privatehttps://sfls.l2.p2p.org, https://sfls-geo-fra.l2.p2p.org, https://sfls-geo-nyc.l2.p2p.org, https://sfls-geo-lon.l2.p2p.org, https://sfls-geo-tky.l2.p2p.org, https://sfls-geo-sgp.l2.p2p.orgAPI keyStill requires tip in transaction

Sending a transaction via public endpoint

The public endpoint requires no API key. Instead, include a System Program transfer to one of the tip accounts in your transaction.

Tip accounts:

BPZrtYhdoAhiHWV5EgGLoV7bZFbMamBZurGDq4DmST8v

Minimum tip: 100,000 lamports

If the tip is missing or insufficient, an error is returned:

  • Missing tip: "Missing tip: no transfer to tip accounts found" (code -32602)
  • Insufficient tip: "Insufficient tip: provided X lamports, required Y lamports" (code -32602)

Example request (cURL):

curl -X POST https://sfls.l2.p2p.org/public \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "sendTransaction",
    "params": ["<BASE64_ENCODED_TX_WITH_TIP>", {"encoding": "base64"}]
  }'

Note: The transaction itself must contain a tip instruction to a tip account. No Authorization header is needed.

Example response:

{
  "jsonrpc": "2.0",
  "result": "<TRANSACTION_SIGNATURE>",
  "id": 1
}

Sending a transaction via private endpoint

Getting an API key

Contact the P2P.org team to get your API key and client profile: t.me/P2Pstaking.

Authentication

Syncro Sender supports two authentication headers via private endpoint. If both are present, Authorization: Bearer takes priority.

HeaderFormatPriority
AuthorizationBearer <API_KEY>1 (preferred)
X-Api-Key<API_KEY>2 (fallback)

Example request:

curl -X POST https://sfls.l2.p2p.org \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "sendTransaction",
    "params": ["<BASE64_ENCODED_TX>", {"encoding": "base64"}]
  }'

Example response:

{
  "jsonrpc": "2.0",
  "result": "<TRANSACTION_SIGNATURE>",
  "id": 1
}

Error codes

CodeNameHTTP StatusDescription
-32700PARSE_ERROR400Malformed JSON-RPC request body
-32600INVALID_REQUEST400 / 403Invalid request structure or authentication failure
-32601METHOD_NOT_FOUND200Unsupported method (e.g., non-sendTransaction on public endpoint)
-32602INVALID_PARAMS200 / 400Invalid parameters, missing tip, or insufficient tip amount
-32603INTERNAL_ERROR500Server-side processing error
-32000SERVER_ERROR500General server error
-32005RATE_LIMIT429Rate limit exceeded

Error response format:

{
  "jsonrpc": "2.0",
  "result": null,
  "error": {
    "code": -32005,
    "message": "Rate limit exceeded"
  },
  "id": 1
}

Rate limit headers

If the rate limit is hit (HTTP 429), the response includes these headers:

HeaderDescription
X-RateLimit-LimitMaximum requests per second for your client
X-RateLimit-RemainingRemaining requests in the current 1-second window
Retry-AfterSeconds until the rate limit window resets (minimum 1)

What's next?