Configures Render private services—internal-only apps that accept traffic exclusively from other Render services over the private network. Use when the user needs an internal API, microservice, gRPC server, sidecar, or any service that should not be publicly accessible. Also use when choosing between a private service and a background worker. Trigger terms: private service, pserv, internal service, internal API, microservice, gRPC, not public, private network service.
75
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Private services are identical to web services except they have no public URL. They are reachable only by other Render services on the same private network (same region + workspace). Use them for internal APIs, microservices, gRPC servers, sidecar processes, and anything that should never face the internet.
For public-facing HTTP services, use render-web-services. For services that don't receive any traffic, use render-background-workers.
| Criterion | Private Service | Background Worker |
|---|---|---|
| Binds to a port | Yes (required) | No |
| Receives private network traffic | Yes | No |
| Sends outbound traffic | Yes | Yes |
| Has internal hostname | Yes | No |
| Use case | Internal APIs, gRPC, TCP servers | Queue consumers, async processors |
Rule of thumb: If the process listens on a port and other services call it, it's a private service. If it pulls work from a queue and never receives requests, it's a background worker.
onrender.com subdomain—not reachable from the internet<service-name>:<port> on the private network by services in the same region and workspaceOther services reference a private service via its internal hostname and port:
http://<service-name>:<port>In Blueprints, wire the address using fromService:
- key: INTERNAL_API_URL
fromService:
name: my-api
type: pserv
property: hostportAvailable fromService properties for pserv:
| Property | Value |
|---|---|
host | Internal hostname (e.g. my-api) |
port | Port the service listens on |
hostport | host:port combined (e.g. my-api:10000) |
You can also reference a specific env var from the private service using envVarKey instead of property.
Private services must bind to at least one port. If your process does not need to receive traffic, create a background worker instead.
0.0.0.0 (not 127.0.0.1 or localhost)PORT env var defaults to 10000, but you can listen on any non-restricted porthostportservices:
- type: pserv
name: internal-api
runtime: node
region: oregon
plan: starter
buildCommand: npm ci && npm run build
startCommand: npm start
envVars:
- key: DATABASE_URL
fromDatabase:
name: db
property: connectionStringservices:
- type: web
name: gateway
runtime: node
plan: starter
region: oregon
buildCommand: npm ci && npm run build
startCommand: npm start
envVars:
- key: USER_SERVICE_URL
fromService:
name: user-service
type: pserv
property: hostport
- key: BILLING_SERVICE_URL
fromService:
name: billing-service
type: pserv
property: hostport
- type: pserv
name: user-service
runtime: node
plan: starter
region: oregon
buildCommand: npm ci
startCommand: node server.js
envVars:
- key: DATABASE_URL
fromDatabase:
name: db
property: connectionString
- type: pserv
name: billing-service
runtime: python
plan: starter
region: oregon
buildCommand: pip install -r requirements.txt
startCommand: gunicorn billing:app
envVars:
- key: DATABASE_URL
fromDatabase:
name: db
property: connectionString| Document | Contents |
|---|---|
references/patterns.md | Microservice topology, gRPC setup, sidecar patterns, health checks for private services |
render.yaml schema, fromService wiring11c74d6
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.