AI inference that stays in Canada.

Goshen runs open-weight models on GPUs in Quebec, Canada, behind an OpenAI-compatible API. Fine-tune them on your own data. We keep token counts for invoicing, never your prompts.

Get an API keyOpenAI-compatible · Qwen3-14B · Quebec, Canada · Invoiced monthly
Example request
$ curl https://api.vpcloud.ca/v1/chat/completions \
    -H "Authorization: Bearer $GOSHEN_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{"model": "qwen3-14b", "stream": true,
         "messages": [{"role": "user", "content": "Summarize this ticket in one line."}]}'

data: {"choices":[{"delta":{"content":"Customer"}}]}
data: {"choices":[{"delta":{"content":" was charged twice"}}]}
data: {"choices":[{"delta":{"content":" and wants a refund."}}]}
data: [DONE]
POST/v1/chat/completions
POST/v1/embeddings
POST/v1/files
POST/v1/fine_tuning/jobs

Inference

from openai import OpenAI
 
client = OpenAI(
base_url="https://api.vpcloud.ca/v1",
api_key=os.environ["GOSHEN_API_KEY"],
)
client.chat.completions.create(
model="qwen3-14b",
messages=messages, stream=True)

Keep your OpenAI client

Chat completions with streaming and tool calls, embeddings and model listing follow the OpenAI API. Change the base URL and the key, and existing code runs.

GET /v1/models
 
qwen3-14b chat, tools
qwen3-embedding-0.6b embeddings
ft:qwen3-14b:support… your fine-tune
 
base models: Apache-2.0
served with vLLM on NVIDIA A100 80 GB

Open-weight models

Qwen3-14B for chat and Qwen3-Embedding-0.6B for embeddings, both under the Apache 2.0 licence, served with vLLM on NVIDIA A100 80 GB GPUs.

Your data

What a request leaves behind
 
{
"model": "qwen3-14b",
"prompt_tokens": 412,
"completion_tokens": 96,
"prompt": "…" never stored
"completion": "…" never stored
}

Prompts are not stored

Prompts and completions pass through memory on the way to the model and back. They are never written to the database, logs or disk. An automated test sends marked text through every API path and checks the database and logs for it.

Where a request goes
 
you
└─ api.vpcloud.ca TLS, Quebec
└─ gateway keys, limits, metering
└─ vLLM A100 GPU, Quebec
 
encrypted tunnel between servers
no CDN, analytics or error tracking

It runs in Quebec

The API, the database, the GPUs and the encrypted backups run on servers we rent from Hyperstack in its CANADA-1 region in Quebec, Canada. Hyperstack is run by NexGen Cloud, a company headquartered in the United Kingdom. Your data stays on its servers in Quebec. No US analytics, error tracking or CDN sits in the path of your requests.

Fine-tuning

12:04 Fine-tuning job started
12:05 Step 10/40 loss 1.42
12:06 Step 20/40 loss 0.97
12:08 Step 40/40 loss 0.61
12:08 New fine-tuned model created:
ft:qwen3-14b:support:1a2b3c4d

Train on your own examples

Upload a JSONL file of chat examples and start a LoRA job from the API or the dashboard. Progress and loss appear as it trains, and the result is a model you call by name. Training runs on a different GPU from the one that serves requests.

DELETE /v1/models/{id}
{"id": "ft:qwen3-14b:support:1a2b3c4d",
"object": "model", "deleted": true}
 
DELETE /v1/files/{id}
{"id": "file-9c41d2e07a3b5f6e8d1c2a04",
"object": "file", "deleted": true}

Deleting means deleted

Each training file is encrypted with its own key. Deleting it removes the file and the key. Deleting a model unloads it and removes its adapter from the GPU server. Encrypted backups age out after 14 days.

Organizations and access

Acme · 3 projects · 4 members
 
ana@example.com owner
sam@example.com admin
lee@example.com member
kim@example.com viewer
 
invite link member single use, 7 days

Organizations, projects and roles

Every account starts with an organization of its own and a Default project. Add projects, and invite people with single-use links that expire after 7 days. Goshen sends no email, so you pass the link on yourself. Each person has one role across the organization: viewer, member, admin or owner.

Keys in support-bot
 
gsk_4f2a...c7Tu prod Inference
gsk_b7d0...91Ke tuner Fine-tuning
gsk_0c9e...5mWq ci All read-only
 
prod: POST /v1/files
403 service_not_allowed

Keys scoped to one project

A key works in its own project, and another project's resources answer 404, even in the same organization. Limit a key to some services or make it read-only. A key acts with its creator's current role and stops working when they leave.

Default quotas, per project
 
active API keys 25
files 50
file storage 5 GB
jobs queued or running 3
 
Default rate limits, per key
60 req/min · 200,000 tokens/min

Quotas and rate limits

Each project has quotas, checked before anything is created, and each key has rate limits reported in x-ratelimit headers. Write to us to raise either.

Audit log · support-bot
 
10:42 key.create sam@example.com
10:44 file.upload sam@example.com
10:45 finetune.create sam@example.com
11:02 model.delete ana@example.com
11:30 member.role ana@example.com
 
never what a request said

Usage and the audit log

The dashboard shows usage per service and inference tokens per day. The audit log records who created keys, uploaded or deleted files, started jobs, deleted models and changed members, with no request content. Read it in the dashboard or with GET /v1/audit_log.

What we keep

What Goshen stores when you use it, and for how long. The privacy page has the rest, including account data.

Prompts and completions
Not stored
The text of chat and embeddings requests and their replies. Only their token counts are kept, in the request records below.
Request records
As accounting requires
Account, project, key, model, endpoint, time, token counts, HTTP status and duration, and nothing the request said. Kept after an account is deleted.
Server logs
50 MB per service
Method, route, status, timing and a short form of the API key, as your key list shows it. Never bodies or query strings.
Training files
Until you delete
Encrypted with AES-256-GCM under a key for that file alone. During a job, the GPU server holds the decrypted examples in memory, never on its disk.
Fine-tuned models
Until you delete
Adapter weights on the GPU server. Only API keys in the project that trained the model can call it. Not backed up.
Audit log
Kept
Who did what in each project, with the IP address it came from and no request content. Your view leaves out the IP addresses. Entries stay after an account is deleted, without its email.
Backups
14 days
Copies of the database and the encrypted training files, encrypted twice, on a separate volume in the same Hyperstack CANADA-1 region in Quebec. Deleted data is gone from them within 15 days.

Endpoints

Every route takes an API key as a Bearer token. Full reference in the docs.

POST/v1/chat/completionsChat, streamed or not
POST/v1/embeddingsVectors for search
GET/v1/modelsBase models and your fine-tunes
POST/v1/filesUpload training data
GET/v1/files/{id}/contentDownload your training data
POST/v1/fine_tuning/jobsStart a LoRA job
DELETE/v1/models/{id}Remove a fine-tuned model
GET/v1/audit_logWho did what in your project

Roadmap

Planned, not built. Nothing here is available today, and none of it has a date.

Storage and databases

Coming soon

Object storage with buckets and access keys per project, block volumes, and managed Postgres databases.

App platform

Coming soon

Deploy apps from a container image or a git repository, with replicas, environment variables, secrets and custom domains with TLS.

More AI services

Coming soon

Batch inference, dedicated endpoints for a single project, GPU jobs, notebooks and more open-weight models.

DNS and secrets

Coming soon

APIs for DNS zones and records, secrets and encryption keys, plus service accounts and audit log exports.

Pricing

No card, no self-serve billing in this first version.

Contact us for pricing at michael@goshen.fyi.

Usage is metered per token and invoiced monthly. New accounts are switched on once invoicing details are in place.

Get an API key