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.
| Endpoint | URL | Auth Method | Notes |
|---|---|---|---|
| Public | https://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/public | Tip in transaction | sendTransaction only |
| Private | https://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.org | API key | Still 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
Authorizationheader 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.
| Header | Format | Priority |
|---|---|---|
Authorization | Bearer <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
| Code | Name | HTTP Status | Description |
|---|---|---|---|
-32700 | PARSE_ERROR | 400 | Malformed JSON-RPC request body |
-32600 | INVALID_REQUEST | 400 / 403 | Invalid request structure or authentication failure |
-32601 | METHOD_NOT_FOUND | 200 | Unsupported method (e.g., non-sendTransaction on public endpoint) |
-32602 | INVALID_PARAMS | 200 / 400 | Invalid parameters, missing tip, or insufficient tip amount |
-32603 | INTERNAL_ERROR | 500 | Server-side processing error |
-32000 | SERVER_ERROR | 500 | General server error |
-32005 | RATE_LIMIT | 429 | Rate 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:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per second for your client |
X-RateLimit-Remaining | Remaining requests in the current 1-second window |
Retry-After | Seconds until the rate limit window resets (minimum 1) |
What's next?
Updated about 4 hours ago