[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-encore-encore-go-api":3,"mdc-1fvc9-key":34,"related-repo-encore-encore-go-api":1602,"related-org-encore-encore-go-api":1705},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":21,"repoUrl":22,"updatedAt":23,"license":24,"forks":25,"topics":26,"repo":29,"sourceUrl":32,"mdContent":33},"encore-go-api","build APIs with Encore Go","Define typed API endpoints in Encore Go using `\u002F\u002Fencore:api` annotations. Covers typed request\u002Fresponse structs, path\u002Fquery\u002Fheader\u002Fcookie params, and error returns. For raw endpoints (`\u002F\u002Fencore:api raw`) and inbound webhooks, use `encore-go-webhook` instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"encore","Encore","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fencore.png","encoredev",[13,15,18],{"name":9,"slug":8,"type":14},"tag",{"name":16,"slug":17,"type":14},"API Development","api-development",{"name":19,"slug":20,"type":14},"Go","go",26,"https:\u002F\u002Fgithub.com\u002Fencoredev\u002Fskills","2026-04-06T18:09:48.578781",null,5,[27,28],"claude-code","skills",{"repoUrl":22,"stars":21,"forks":25,"topics":30,"description":31},[27,28],"Agent Skills for development with Encore.","https:\u002F\u002Fgithub.com\u002Fencoredev\u002Fskills\u002Ftree\u002FHEAD\u002Fencore\u002Fgo-api","---\nname: encore-go-api\ndescription: Define typed API endpoints in Encore Go using `\u002F\u002Fencore:api` annotations. Covers typed request\u002Fresponse structs, path\u002Fquery\u002Fheader\u002Fcookie params, and error returns. For raw endpoints (`\u002F\u002Fencore:api raw`) and inbound webhooks, use `encore-go-webhook` instead.\nwhen_to_use: >-\n  User wants to define an endpoint, route, or REST handler in their own Go service — anything with a typed JSON request\u002Fresponse shape. Mentions of an endpoint, GET\u002FPOST\u002FPUT\u002FPATCH\u002FDELETE, paths like `\u002Forders` or `\u002Fusers\u002F:id`, request body, query parameters (`query:\"name\"` tag), path parameters, headers (`header:\"Name\"` tag), HTTP status codes, request validation, `errs.NotFound` \u002F 4xx-5xx errors, or `\u002F\u002Fencore:api public`. Trigger phrases: \"POST endpoint at \u002Forders\", \"typed Go endpoint\", \"GET \u002Fusers\u002F:id\", \"request validation\", \"return 404\", \"JSON response shape\".\n---\n\n# Encore Go API Endpoints\n\n## Instructions\n\nWhen creating API endpoints with Encore Go, follow these patterns:\n\n### 1. Basic API Endpoint\n\nUse the `\u002F\u002Fencore:api` annotation above your function:\n\n```go\npackage user\n\nimport \"context\"\n\ntype GetUserParams struct {\n    ID string\n}\n\ntype User struct {\n    ID    string `json:\"id\"`\n    Email string `json:\"email\"`\n    Name  string `json:\"name\"`\n}\n\n\u002F\u002Fencore:api public method=GET path=\u002Fusers\u002F:id\nfunc GetUser(ctx context.Context, params *GetUserParams) (*User, error) {\n    \u002F\u002F Implementation\n    return &User{ID: params.ID, Email: \"user@example.com\", Name: \"John\"}, nil\n}\n```\n\n### 2. POST with Request Body\n\n```go\ntype CreateUserParams struct {\n    Email string `json:\"email\"`\n    Name  string `json:\"name\"`\n}\n\n\u002F\u002Fencore:api public method=POST path=\u002Fusers\nfunc CreateUser(ctx context.Context, params *CreateUserParams) (*User, error) {\n    \u002F\u002F Implementation\n    return &User{ID: \"new-id\", Email: params.Email, Name: params.Name}, nil\n}\n```\n\n## API Annotation Options\n\n| Option | Values | Description |\n|--------|--------|-------------|\n| `public` | - | Accessible from outside |\n| `private` | - | Only callable from other services |\n| `auth` | - | Requires authentication |\n| `method` | GET, POST, PUT, PATCH, DELETE | HTTP method |\n| `path` | string | URL path with `:param` for path params |\n| `sensitive` | - | Redacts request\u002Fresponse payloads from traces |\n\n### Examples\n\n```go\n\u002F\u002Fencore:api public method=GET path=\u002Fhealth\n\u002F\u002Fencore:api private method=POST path=\u002Finternal\u002Fprocess\n\u002F\u002Fencore:api auth method=GET path=\u002Fprofile\n\u002F\u002Fencore:api public sensitive method=POST path=\u002Fauth\u002Flogin\n```\n\n## Sensitive Data\n\nMark sensitive fields to redact them from tracing logs:\n\n```go\ntype LoginParams struct {\n    Email    string `json:\"email\"`\n    Password string `json:\"password\" encore:\"sensitive\"`\n}\n```\n\nOr mark the entire endpoint as sensitive in the annotation:\n\n```go\n\u002F\u002Fencore:api public sensitive method=POST path=\u002Fauth\u002Flogin\nfunc Login(ctx context.Context, params *LoginParams) (*TokenResponse, error) {\n    \u002F\u002F Request and response will be redacted from traces\n}\n```\n\n## Custom HTTP Status Codes\n\nReturn custom HTTP status codes using the `encore:\"httpstatus\"` tag:\n\n```go\ntype CreateResponse struct {\n    ID     string `json:\"id\"`\n    Status int    `encore:\"httpstatus\"`\n}\n\n\u002F\u002Fencore:api public method=POST path=\u002Fitems\nfunc CreateItem(ctx context.Context, params *CreateParams) (*CreateResponse, error) {\n    item := createItem(params)\n    return &CreateResponse{\n        ID:     item.ID,\n        Status: 201,  \u002F\u002F Returns HTTP 201 Created\n    }, nil\n}\n```\n\n## Request Parameter Sources\n\n### Path Parameters\n\n```go\n\u002F\u002F Path: \u002Fusers\u002F:id\ntype GetUserParams struct {\n    ID string  \u002F\u002F Automatically mapped from :id\n}\n```\n\n### Query Parameters\n\n```go\n\u002F\u002F Path: \u002Fusers\ntype ListUsersParams struct {\n    Limit  int `query:\"limit\"`\n    Offset int `query:\"offset\"`\n}\n\n\u002F\u002Fencore:api public method=GET path=\u002Fusers\nfunc ListUsers(ctx context.Context, params *ListUsersParams) (*ListResponse, error) {\n    \u002F\u002F params.Limit and params.Offset come from query string\n}\n```\n\n### Headers\n\n```go\ntype WebhookParams struct {\n    Signature string `header:\"X-Webhook-Signature\"`\n    Payload   string `json:\"payload\"`\n}\n```\n\n### Cookies\n\n```go\nimport \"net\u002Fhttp\"\n\ntype AuthParams struct {\n    SessionCookie *http.Cookie `cookie:\"session\"`\n    CSRFToken     string       `header:\"X-CSRF-Token\"`\n}\n\n\u002F\u002Fencore:api auth method=POST path=\u002Flogout\nfunc Logout(ctx context.Context, params *AuthParams) error {\n    \u002F\u002F Access params.SessionCookie.Value\n    return nil\n}\n```\n\n## Response Types\n\n### Standard Response\n\n```go\ntype Response struct {\n    Message string `json:\"message\"`\n}\n\n\u002F\u002Fencore:api public method=GET path=\u002Fhello\nfunc Hello(ctx context.Context) (*Response, error) {\n    return &Response{Message: \"Hello, World!\"}, nil\n}\n```\n\n### No Response Body\n\n```go\n\u002F\u002Fencore:api public method=DELETE path=\u002Fusers\u002F:id\nfunc DeleteUser(ctx context.Context, params *DeleteParams) error {\n    \u002F\u002F Return only error (no response body on success)\n    return nil\n}\n```\n\n### No Request Parameters\n\n```go\n\u002F\u002Fencore:api public method=GET path=\u002Fhealth\nfunc Health(ctx context.Context) (*HealthResponse, error) {\n    return &HealthResponse{Status: \"ok\"}, nil\n}\n```\n\n## Error Handling\n\nUse `errs` package for proper HTTP error responses:\n\n```go\nimport \"encore.dev\u002Fbeta\u002Ferrs\"\n\n\u002F\u002Fencore:api public method=GET path=\u002Fusers\u002F:id\nfunc GetUser(ctx context.Context, params *GetUserParams) (*User, error) {\n    user, err := findUser(params.ID)\n    if err != nil {\n        return nil, err\n    }\n    if user == nil {\n        return nil, &errs.Error{\n            Code:    errs.NotFound,\n            Message: \"user not found\",\n        }\n    }\n    return user, nil\n}\n```\n\n### Common Error Codes\n\n| Code | HTTP Status | Usage |\n|------|-------------|-------|\n| `errs.NotFound` | 404 | Resource doesn't exist |\n| `errs.InvalidArgument` | 400 | Bad input |\n| `errs.Unauthenticated` | 401 | Missing\u002Finvalid auth |\n| `errs.PermissionDenied` | 403 | Not allowed |\n| `errs.AlreadyExists` | 409 | Duplicate resource |\n\n## Guidelines\n\n- Use `\u002F\u002Fencore:api` annotation above the function\n- Request params must be a pointer to a struct or omitted\n- Response must be a pointer to a struct (or omit for no body)\n- Always return `error` as the last return value\n- Use struct tags for JSON field names, query params, and headers\n- Path parameters are automatically mapped to struct fields by name\n",{"data":35,"body":37},{"name":4,"description":6,"when_to_use":36},"User wants to define an endpoint, route, or REST handler in their own Go service — anything with a typed JSON request\u002Fresponse shape. Mentions of an endpoint, GET\u002FPOST\u002FPUT\u002FPATCH\u002FDELETE, paths like `\u002Forders` or `\u002Fusers\u002F:id`, request body, query parameters (`query:\"name\"` tag), path parameters, headers (`header:\"Name\"` tag), HTTP status codes, request validation, `errs.NotFound` \u002F 4xx-5xx errors, or `\u002F\u002Fencore:api public`. Trigger phrases: \"POST endpoint at \u002Forders\", \"typed Go endpoint\", \"GET \u002Fusers\u002F:id\", \"request validation\", \"return 404\", \"JSON response shape\".",{"type":38,"children":39},"root",[40,49,56,62,69,83,261,267,348,354,524,530,569,575,580,618,623,660,666,679,787,793,799,836,842,926,932,970,976,1075,1081,1087,1155,1161,1206,1212,1249,1255,1268,1398,1404,1541,1547,1596],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"encore-go-api-endpoints",[46],{"type":47,"value":48},"text","Encore Go API Endpoints",{"type":41,"tag":50,"props":51,"children":53},"h2",{"id":52},"instructions",[54],{"type":47,"value":55},"Instructions",{"type":41,"tag":57,"props":58,"children":59},"p",{},[60],{"type":47,"value":61},"When creating API endpoints with Encore Go, follow these patterns:",{"type":41,"tag":63,"props":64,"children":66},"h3",{"id":65},"_1-basic-api-endpoint",[67],{"type":47,"value":68},"1. Basic API Endpoint",{"type":41,"tag":57,"props":70,"children":71},{},[72,74,81],{"type":47,"value":73},"Use the ",{"type":41,"tag":75,"props":76,"children":78},"code",{"className":77},[],[79],{"type":47,"value":80},"\u002F\u002Fencore:api",{"type":47,"value":82}," annotation above your function:",{"type":41,"tag":84,"props":85,"children":89},"pre",{"className":86,"code":87,"language":20,"meta":88,"style":88},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package user\n\nimport \"context\"\n\ntype GetUserParams struct {\n    ID string\n}\n\ntype User struct {\n    ID    string `json:\"id\"`\n    Email string `json:\"email\"`\n    Name  string `json:\"name\"`\n}\n\n\u002F\u002Fencore:api public method=GET path=\u002Fusers\u002F:id\nfunc GetUser(ctx context.Context, params *GetUserParams) (*User, error) {\n    \u002F\u002F Implementation\n    return &User{ID: params.ID, Email: \"user@example.com\", Name: \"John\"}, nil\n}\n","",[90],{"type":41,"tag":75,"props":91,"children":92},{"__ignoreMap":88},[93,104,114,123,131,139,148,157,165,174,183,192,201,209,217,226,235,244,253],{"type":41,"tag":94,"props":95,"children":98},"span",{"class":96,"line":97},"line",1,[99],{"type":41,"tag":94,"props":100,"children":101},{},[102],{"type":47,"value":103},"package user\n",{"type":41,"tag":94,"props":105,"children":107},{"class":96,"line":106},2,[108],{"type":41,"tag":94,"props":109,"children":111},{"emptyLinePlaceholder":110},true,[112],{"type":47,"value":113},"\n",{"type":41,"tag":94,"props":115,"children":117},{"class":96,"line":116},3,[118],{"type":41,"tag":94,"props":119,"children":120},{},[121],{"type":47,"value":122},"import \"context\"\n",{"type":41,"tag":94,"props":124,"children":126},{"class":96,"line":125},4,[127],{"type":41,"tag":94,"props":128,"children":129},{"emptyLinePlaceholder":110},[130],{"type":47,"value":113},{"type":41,"tag":94,"props":132,"children":133},{"class":96,"line":25},[134],{"type":41,"tag":94,"props":135,"children":136},{},[137],{"type":47,"value":138},"type GetUserParams struct {\n",{"type":41,"tag":94,"props":140,"children":142},{"class":96,"line":141},6,[143],{"type":41,"tag":94,"props":144,"children":145},{},[146],{"type":47,"value":147},"    ID string\n",{"type":41,"tag":94,"props":149,"children":151},{"class":96,"line":150},7,[152],{"type":41,"tag":94,"props":153,"children":154},{},[155],{"type":47,"value":156},"}\n",{"type":41,"tag":94,"props":158,"children":160},{"class":96,"line":159},8,[161],{"type":41,"tag":94,"props":162,"children":163},{"emptyLinePlaceholder":110},[164],{"type":47,"value":113},{"type":41,"tag":94,"props":166,"children":168},{"class":96,"line":167},9,[169],{"type":41,"tag":94,"props":170,"children":171},{},[172],{"type":47,"value":173},"type User struct {\n",{"type":41,"tag":94,"props":175,"children":177},{"class":96,"line":176},10,[178],{"type":41,"tag":94,"props":179,"children":180},{},[181],{"type":47,"value":182},"    ID    string `json:\"id\"`\n",{"type":41,"tag":94,"props":184,"children":186},{"class":96,"line":185},11,[187],{"type":41,"tag":94,"props":188,"children":189},{},[190],{"type":47,"value":191},"    Email string `json:\"email\"`\n",{"type":41,"tag":94,"props":193,"children":195},{"class":96,"line":194},12,[196],{"type":41,"tag":94,"props":197,"children":198},{},[199],{"type":47,"value":200},"    Name  string `json:\"name\"`\n",{"type":41,"tag":94,"props":202,"children":204},{"class":96,"line":203},13,[205],{"type":41,"tag":94,"props":206,"children":207},{},[208],{"type":47,"value":156},{"type":41,"tag":94,"props":210,"children":212},{"class":96,"line":211},14,[213],{"type":41,"tag":94,"props":214,"children":215},{"emptyLinePlaceholder":110},[216],{"type":47,"value":113},{"type":41,"tag":94,"props":218,"children":220},{"class":96,"line":219},15,[221],{"type":41,"tag":94,"props":222,"children":223},{},[224],{"type":47,"value":225},"\u002F\u002Fencore:api public method=GET path=\u002Fusers\u002F:id\n",{"type":41,"tag":94,"props":227,"children":229},{"class":96,"line":228},16,[230],{"type":41,"tag":94,"props":231,"children":232},{},[233],{"type":47,"value":234},"func GetUser(ctx context.Context, params *GetUserParams) (*User, error) {\n",{"type":41,"tag":94,"props":236,"children":238},{"class":96,"line":237},17,[239],{"type":41,"tag":94,"props":240,"children":241},{},[242],{"type":47,"value":243},"    \u002F\u002F Implementation\n",{"type":41,"tag":94,"props":245,"children":247},{"class":96,"line":246},18,[248],{"type":41,"tag":94,"props":249,"children":250},{},[251],{"type":47,"value":252},"    return &User{ID: params.ID, Email: \"user@example.com\", Name: \"John\"}, nil\n",{"type":41,"tag":94,"props":254,"children":256},{"class":96,"line":255},19,[257],{"type":41,"tag":94,"props":258,"children":259},{},[260],{"type":47,"value":156},{"type":41,"tag":63,"props":262,"children":264},{"id":263},"_2-post-with-request-body",[265],{"type":47,"value":266},"2. POST with Request Body",{"type":41,"tag":84,"props":268,"children":270},{"className":86,"code":269,"language":20,"meta":88,"style":88},"type CreateUserParams struct {\n    Email string `json:\"email\"`\n    Name  string `json:\"name\"`\n}\n\n\u002F\u002Fencore:api public method=POST path=\u002Fusers\nfunc CreateUser(ctx context.Context, params *CreateUserParams) (*User, error) {\n    \u002F\u002F Implementation\n    return &User{ID: \"new-id\", Email: params.Email, Name: params.Name}, nil\n}\n",[271],{"type":41,"tag":75,"props":272,"children":273},{"__ignoreMap":88},[274,282,289,296,303,310,318,326,333,341],{"type":41,"tag":94,"props":275,"children":276},{"class":96,"line":97},[277],{"type":41,"tag":94,"props":278,"children":279},{},[280],{"type":47,"value":281},"type CreateUserParams struct {\n",{"type":41,"tag":94,"props":283,"children":284},{"class":96,"line":106},[285],{"type":41,"tag":94,"props":286,"children":287},{},[288],{"type":47,"value":191},{"type":41,"tag":94,"props":290,"children":291},{"class":96,"line":116},[292],{"type":41,"tag":94,"props":293,"children":294},{},[295],{"type":47,"value":200},{"type":41,"tag":94,"props":297,"children":298},{"class":96,"line":125},[299],{"type":41,"tag":94,"props":300,"children":301},{},[302],{"type":47,"value":156},{"type":41,"tag":94,"props":304,"children":305},{"class":96,"line":25},[306],{"type":41,"tag":94,"props":307,"children":308},{"emptyLinePlaceholder":110},[309],{"type":47,"value":113},{"type":41,"tag":94,"props":311,"children":312},{"class":96,"line":141},[313],{"type":41,"tag":94,"props":314,"children":315},{},[316],{"type":47,"value":317},"\u002F\u002Fencore:api public method=POST path=\u002Fusers\n",{"type":41,"tag":94,"props":319,"children":320},{"class":96,"line":150},[321],{"type":41,"tag":94,"props":322,"children":323},{},[324],{"type":47,"value":325},"func CreateUser(ctx context.Context, params *CreateUserParams) (*User, error) {\n",{"type":41,"tag":94,"props":327,"children":328},{"class":96,"line":159},[329],{"type":41,"tag":94,"props":330,"children":331},{},[332],{"type":47,"value":243},{"type":41,"tag":94,"props":334,"children":335},{"class":96,"line":167},[336],{"type":41,"tag":94,"props":337,"children":338},{},[339],{"type":47,"value":340},"    return &User{ID: \"new-id\", Email: params.Email, Name: params.Name}, nil\n",{"type":41,"tag":94,"props":342,"children":343},{"class":96,"line":176},[344],{"type":41,"tag":94,"props":345,"children":346},{},[347],{"type":47,"value":156},{"type":41,"tag":50,"props":349,"children":351},{"id":350},"api-annotation-options",[352],{"type":47,"value":353},"API Annotation Options",{"type":41,"tag":355,"props":356,"children":357},"table",{},[358,382],{"type":41,"tag":359,"props":360,"children":361},"thead",{},[362],{"type":41,"tag":363,"props":364,"children":365},"tr",{},[366,372,377],{"type":41,"tag":367,"props":368,"children":369},"th",{},[370],{"type":47,"value":371},"Option",{"type":41,"tag":367,"props":373,"children":374},{},[375],{"type":47,"value":376},"Values",{"type":41,"tag":367,"props":378,"children":379},{},[380],{"type":47,"value":381},"Description",{"type":41,"tag":383,"props":384,"children":385},"tbody",{},[386,409,430,451,473,503],{"type":41,"tag":363,"props":387,"children":388},{},[389,399,404],{"type":41,"tag":390,"props":391,"children":392},"td",{},[393],{"type":41,"tag":75,"props":394,"children":396},{"className":395},[],[397],{"type":47,"value":398},"public",{"type":41,"tag":390,"props":400,"children":401},{},[402],{"type":47,"value":403},"-",{"type":41,"tag":390,"props":405,"children":406},{},[407],{"type":47,"value":408},"Accessible from outside",{"type":41,"tag":363,"props":410,"children":411},{},[412,421,425],{"type":41,"tag":390,"props":413,"children":414},{},[415],{"type":41,"tag":75,"props":416,"children":418},{"className":417},[],[419],{"type":47,"value":420},"private",{"type":41,"tag":390,"props":422,"children":423},{},[424],{"type":47,"value":403},{"type":41,"tag":390,"props":426,"children":427},{},[428],{"type":47,"value":429},"Only callable from other services",{"type":41,"tag":363,"props":431,"children":432},{},[433,442,446],{"type":41,"tag":390,"props":434,"children":435},{},[436],{"type":41,"tag":75,"props":437,"children":439},{"className":438},[],[440],{"type":47,"value":441},"auth",{"type":41,"tag":390,"props":443,"children":444},{},[445],{"type":47,"value":403},{"type":41,"tag":390,"props":447,"children":448},{},[449],{"type":47,"value":450},"Requires authentication",{"type":41,"tag":363,"props":452,"children":453},{},[454,463,468],{"type":41,"tag":390,"props":455,"children":456},{},[457],{"type":41,"tag":75,"props":458,"children":460},{"className":459},[],[461],{"type":47,"value":462},"method",{"type":41,"tag":390,"props":464,"children":465},{},[466],{"type":47,"value":467},"GET, POST, PUT, PATCH, DELETE",{"type":41,"tag":390,"props":469,"children":470},{},[471],{"type":47,"value":472},"HTTP method",{"type":41,"tag":363,"props":474,"children":475},{},[476,485,490],{"type":41,"tag":390,"props":477,"children":478},{},[479],{"type":41,"tag":75,"props":480,"children":482},{"className":481},[],[483],{"type":47,"value":484},"path",{"type":41,"tag":390,"props":486,"children":487},{},[488],{"type":47,"value":489},"string",{"type":41,"tag":390,"props":491,"children":492},{},[493,495,501],{"type":47,"value":494},"URL path with ",{"type":41,"tag":75,"props":496,"children":498},{"className":497},[],[499],{"type":47,"value":500},":param",{"type":47,"value":502}," for path params",{"type":41,"tag":363,"props":504,"children":505},{},[506,515,519],{"type":41,"tag":390,"props":507,"children":508},{},[509],{"type":41,"tag":75,"props":510,"children":512},{"className":511},[],[513],{"type":47,"value":514},"sensitive",{"type":41,"tag":390,"props":516,"children":517},{},[518],{"type":47,"value":403},{"type":41,"tag":390,"props":520,"children":521},{},[522],{"type":47,"value":523},"Redacts request\u002Fresponse payloads from traces",{"type":41,"tag":63,"props":525,"children":527},{"id":526},"examples",[528],{"type":47,"value":529},"Examples",{"type":41,"tag":84,"props":531,"children":533},{"className":86,"code":532,"language":20,"meta":88,"style":88},"\u002F\u002Fencore:api public method=GET path=\u002Fhealth\n\u002F\u002Fencore:api private method=POST path=\u002Finternal\u002Fprocess\n\u002F\u002Fencore:api auth method=GET path=\u002Fprofile\n\u002F\u002Fencore:api public sensitive method=POST path=\u002Fauth\u002Flogin\n",[534],{"type":41,"tag":75,"props":535,"children":536},{"__ignoreMap":88},[537,545,553,561],{"type":41,"tag":94,"props":538,"children":539},{"class":96,"line":97},[540],{"type":41,"tag":94,"props":541,"children":542},{},[543],{"type":47,"value":544},"\u002F\u002Fencore:api public method=GET path=\u002Fhealth\n",{"type":41,"tag":94,"props":546,"children":547},{"class":96,"line":106},[548],{"type":41,"tag":94,"props":549,"children":550},{},[551],{"type":47,"value":552},"\u002F\u002Fencore:api private method=POST path=\u002Finternal\u002Fprocess\n",{"type":41,"tag":94,"props":554,"children":555},{"class":96,"line":116},[556],{"type":41,"tag":94,"props":557,"children":558},{},[559],{"type":47,"value":560},"\u002F\u002Fencore:api auth method=GET path=\u002Fprofile\n",{"type":41,"tag":94,"props":562,"children":563},{"class":96,"line":125},[564],{"type":41,"tag":94,"props":565,"children":566},{},[567],{"type":47,"value":568},"\u002F\u002Fencore:api public sensitive method=POST path=\u002Fauth\u002Flogin\n",{"type":41,"tag":50,"props":570,"children":572},{"id":571},"sensitive-data",[573],{"type":47,"value":574},"Sensitive Data",{"type":41,"tag":57,"props":576,"children":577},{},[578],{"type":47,"value":579},"Mark sensitive fields to redact them from tracing logs:",{"type":41,"tag":84,"props":581,"children":583},{"className":86,"code":582,"language":20,"meta":88,"style":88},"type LoginParams struct {\n    Email    string `json:\"email\"`\n    Password string `json:\"password\" encore:\"sensitive\"`\n}\n",[584],{"type":41,"tag":75,"props":585,"children":586},{"__ignoreMap":88},[587,595,603,611],{"type":41,"tag":94,"props":588,"children":589},{"class":96,"line":97},[590],{"type":41,"tag":94,"props":591,"children":592},{},[593],{"type":47,"value":594},"type LoginParams struct {\n",{"type":41,"tag":94,"props":596,"children":597},{"class":96,"line":106},[598],{"type":41,"tag":94,"props":599,"children":600},{},[601],{"type":47,"value":602},"    Email    string `json:\"email\"`\n",{"type":41,"tag":94,"props":604,"children":605},{"class":96,"line":116},[606],{"type":41,"tag":94,"props":607,"children":608},{},[609],{"type":47,"value":610},"    Password string `json:\"password\" encore:\"sensitive\"`\n",{"type":41,"tag":94,"props":612,"children":613},{"class":96,"line":125},[614],{"type":41,"tag":94,"props":615,"children":616},{},[617],{"type":47,"value":156},{"type":41,"tag":57,"props":619,"children":620},{},[621],{"type":47,"value":622},"Or mark the entire endpoint as sensitive in the annotation:",{"type":41,"tag":84,"props":624,"children":626},{"className":86,"code":625,"language":20,"meta":88,"style":88},"\u002F\u002Fencore:api public sensitive method=POST path=\u002Fauth\u002Flogin\nfunc Login(ctx context.Context, params *LoginParams) (*TokenResponse, error) {\n    \u002F\u002F Request and response will be redacted from traces\n}\n",[627],{"type":41,"tag":75,"props":628,"children":629},{"__ignoreMap":88},[630,637,645,653],{"type":41,"tag":94,"props":631,"children":632},{"class":96,"line":97},[633],{"type":41,"tag":94,"props":634,"children":635},{},[636],{"type":47,"value":568},{"type":41,"tag":94,"props":638,"children":639},{"class":96,"line":106},[640],{"type":41,"tag":94,"props":641,"children":642},{},[643],{"type":47,"value":644},"func Login(ctx context.Context, params *LoginParams) (*TokenResponse, error) {\n",{"type":41,"tag":94,"props":646,"children":647},{"class":96,"line":116},[648],{"type":41,"tag":94,"props":649,"children":650},{},[651],{"type":47,"value":652},"    \u002F\u002F Request and response will be redacted from traces\n",{"type":41,"tag":94,"props":654,"children":655},{"class":96,"line":125},[656],{"type":41,"tag":94,"props":657,"children":658},{},[659],{"type":47,"value":156},{"type":41,"tag":50,"props":661,"children":663},{"id":662},"custom-http-status-codes",[664],{"type":47,"value":665},"Custom HTTP Status Codes",{"type":41,"tag":57,"props":667,"children":668},{},[669,671,677],{"type":47,"value":670},"Return custom HTTP status codes using the ",{"type":41,"tag":75,"props":672,"children":674},{"className":673},[],[675],{"type":47,"value":676},"encore:\"httpstatus\"",{"type":47,"value":678}," tag:",{"type":41,"tag":84,"props":680,"children":682},{"className":86,"code":681,"language":20,"meta":88,"style":88},"type CreateResponse struct {\n    ID     string `json:\"id\"`\n    Status int    `encore:\"httpstatus\"`\n}\n\n\u002F\u002Fencore:api public method=POST path=\u002Fitems\nfunc CreateItem(ctx context.Context, params *CreateParams) (*CreateResponse, error) {\n    item := createItem(params)\n    return &CreateResponse{\n        ID:     item.ID,\n        Status: 201,  \u002F\u002F Returns HTTP 201 Created\n    }, nil\n}\n",[683],{"type":41,"tag":75,"props":684,"children":685},{"__ignoreMap":88},[686,694,702,710,717,724,732,740,748,756,764,772,780],{"type":41,"tag":94,"props":687,"children":688},{"class":96,"line":97},[689],{"type":41,"tag":94,"props":690,"children":691},{},[692],{"type":47,"value":693},"type CreateResponse struct {\n",{"type":41,"tag":94,"props":695,"children":696},{"class":96,"line":106},[697],{"type":41,"tag":94,"props":698,"children":699},{},[700],{"type":47,"value":701},"    ID     string `json:\"id\"`\n",{"type":41,"tag":94,"props":703,"children":704},{"class":96,"line":116},[705],{"type":41,"tag":94,"props":706,"children":707},{},[708],{"type":47,"value":709},"    Status int    `encore:\"httpstatus\"`\n",{"type":41,"tag":94,"props":711,"children":712},{"class":96,"line":125},[713],{"type":41,"tag":94,"props":714,"children":715},{},[716],{"type":47,"value":156},{"type":41,"tag":94,"props":718,"children":719},{"class":96,"line":25},[720],{"type":41,"tag":94,"props":721,"children":722},{"emptyLinePlaceholder":110},[723],{"type":47,"value":113},{"type":41,"tag":94,"props":725,"children":726},{"class":96,"line":141},[727],{"type":41,"tag":94,"props":728,"children":729},{},[730],{"type":47,"value":731},"\u002F\u002Fencore:api public method=POST path=\u002Fitems\n",{"type":41,"tag":94,"props":733,"children":734},{"class":96,"line":150},[735],{"type":41,"tag":94,"props":736,"children":737},{},[738],{"type":47,"value":739},"func CreateItem(ctx context.Context, params *CreateParams) (*CreateResponse, error) {\n",{"type":41,"tag":94,"props":741,"children":742},{"class":96,"line":159},[743],{"type":41,"tag":94,"props":744,"children":745},{},[746],{"type":47,"value":747},"    item := createItem(params)\n",{"type":41,"tag":94,"props":749,"children":750},{"class":96,"line":167},[751],{"type":41,"tag":94,"props":752,"children":753},{},[754],{"type":47,"value":755},"    return &CreateResponse{\n",{"type":41,"tag":94,"props":757,"children":758},{"class":96,"line":176},[759],{"type":41,"tag":94,"props":760,"children":761},{},[762],{"type":47,"value":763},"        ID:     item.ID,\n",{"type":41,"tag":94,"props":765,"children":766},{"class":96,"line":185},[767],{"type":41,"tag":94,"props":768,"children":769},{},[770],{"type":47,"value":771},"        Status: 201,  \u002F\u002F Returns HTTP 201 Created\n",{"type":41,"tag":94,"props":773,"children":774},{"class":96,"line":194},[775],{"type":41,"tag":94,"props":776,"children":777},{},[778],{"type":47,"value":779},"    }, nil\n",{"type":41,"tag":94,"props":781,"children":782},{"class":96,"line":203},[783],{"type":41,"tag":94,"props":784,"children":785},{},[786],{"type":47,"value":156},{"type":41,"tag":50,"props":788,"children":790},{"id":789},"request-parameter-sources",[791],{"type":47,"value":792},"Request Parameter Sources",{"type":41,"tag":63,"props":794,"children":796},{"id":795},"path-parameters",[797],{"type":47,"value":798},"Path Parameters",{"type":41,"tag":84,"props":800,"children":802},{"className":86,"code":801,"language":20,"meta":88,"style":88},"\u002F\u002F Path: \u002Fusers\u002F:id\ntype GetUserParams struct {\n    ID string  \u002F\u002F Automatically mapped from :id\n}\n",[803],{"type":41,"tag":75,"props":804,"children":805},{"__ignoreMap":88},[806,814,821,829],{"type":41,"tag":94,"props":807,"children":808},{"class":96,"line":97},[809],{"type":41,"tag":94,"props":810,"children":811},{},[812],{"type":47,"value":813},"\u002F\u002F Path: \u002Fusers\u002F:id\n",{"type":41,"tag":94,"props":815,"children":816},{"class":96,"line":106},[817],{"type":41,"tag":94,"props":818,"children":819},{},[820],{"type":47,"value":138},{"type":41,"tag":94,"props":822,"children":823},{"class":96,"line":116},[824],{"type":41,"tag":94,"props":825,"children":826},{},[827],{"type":47,"value":828},"    ID string  \u002F\u002F Automatically mapped from :id\n",{"type":41,"tag":94,"props":830,"children":831},{"class":96,"line":125},[832],{"type":41,"tag":94,"props":833,"children":834},{},[835],{"type":47,"value":156},{"type":41,"tag":63,"props":837,"children":839},{"id":838},"query-parameters",[840],{"type":47,"value":841},"Query Parameters",{"type":41,"tag":84,"props":843,"children":845},{"className":86,"code":844,"language":20,"meta":88,"style":88},"\u002F\u002F Path: \u002Fusers\ntype ListUsersParams struct {\n    Limit  int `query:\"limit\"`\n    Offset int `query:\"offset\"`\n}\n\n\u002F\u002Fencore:api public method=GET path=\u002Fusers\nfunc ListUsers(ctx context.Context, params *ListUsersParams) (*ListResponse, error) {\n    \u002F\u002F params.Limit and params.Offset come from query string\n}\n",[846],{"type":41,"tag":75,"props":847,"children":848},{"__ignoreMap":88},[849,857,865,873,881,888,895,903,911,919],{"type":41,"tag":94,"props":850,"children":851},{"class":96,"line":97},[852],{"type":41,"tag":94,"props":853,"children":854},{},[855],{"type":47,"value":856},"\u002F\u002F Path: \u002Fusers\n",{"type":41,"tag":94,"props":858,"children":859},{"class":96,"line":106},[860],{"type":41,"tag":94,"props":861,"children":862},{},[863],{"type":47,"value":864},"type ListUsersParams struct {\n",{"type":41,"tag":94,"props":866,"children":867},{"class":96,"line":116},[868],{"type":41,"tag":94,"props":869,"children":870},{},[871],{"type":47,"value":872},"    Limit  int `query:\"limit\"`\n",{"type":41,"tag":94,"props":874,"children":875},{"class":96,"line":125},[876],{"type":41,"tag":94,"props":877,"children":878},{},[879],{"type":47,"value":880},"    Offset int `query:\"offset\"`\n",{"type":41,"tag":94,"props":882,"children":883},{"class":96,"line":25},[884],{"type":41,"tag":94,"props":885,"children":886},{},[887],{"type":47,"value":156},{"type":41,"tag":94,"props":889,"children":890},{"class":96,"line":141},[891],{"type":41,"tag":94,"props":892,"children":893},{"emptyLinePlaceholder":110},[894],{"type":47,"value":113},{"type":41,"tag":94,"props":896,"children":897},{"class":96,"line":150},[898],{"type":41,"tag":94,"props":899,"children":900},{},[901],{"type":47,"value":902},"\u002F\u002Fencore:api public method=GET path=\u002Fusers\n",{"type":41,"tag":94,"props":904,"children":905},{"class":96,"line":159},[906],{"type":41,"tag":94,"props":907,"children":908},{},[909],{"type":47,"value":910},"func ListUsers(ctx context.Context, params *ListUsersParams) (*ListResponse, error) {\n",{"type":41,"tag":94,"props":912,"children":913},{"class":96,"line":167},[914],{"type":41,"tag":94,"props":915,"children":916},{},[917],{"type":47,"value":918},"    \u002F\u002F params.Limit and params.Offset come from query string\n",{"type":41,"tag":94,"props":920,"children":921},{"class":96,"line":176},[922],{"type":41,"tag":94,"props":923,"children":924},{},[925],{"type":47,"value":156},{"type":41,"tag":63,"props":927,"children":929},{"id":928},"headers",[930],{"type":47,"value":931},"Headers",{"type":41,"tag":84,"props":933,"children":935},{"className":86,"code":934,"language":20,"meta":88,"style":88},"type WebhookParams struct {\n    Signature string `header:\"X-Webhook-Signature\"`\n    Payload   string `json:\"payload\"`\n}\n",[936],{"type":41,"tag":75,"props":937,"children":938},{"__ignoreMap":88},[939,947,955,963],{"type":41,"tag":94,"props":940,"children":941},{"class":96,"line":97},[942],{"type":41,"tag":94,"props":943,"children":944},{},[945],{"type":47,"value":946},"type WebhookParams struct {\n",{"type":41,"tag":94,"props":948,"children":949},{"class":96,"line":106},[950],{"type":41,"tag":94,"props":951,"children":952},{},[953],{"type":47,"value":954},"    Signature string `header:\"X-Webhook-Signature\"`\n",{"type":41,"tag":94,"props":956,"children":957},{"class":96,"line":116},[958],{"type":41,"tag":94,"props":959,"children":960},{},[961],{"type":47,"value":962},"    Payload   string `json:\"payload\"`\n",{"type":41,"tag":94,"props":964,"children":965},{"class":96,"line":125},[966],{"type":41,"tag":94,"props":967,"children":968},{},[969],{"type":47,"value":156},{"type":41,"tag":63,"props":971,"children":973},{"id":972},"cookies",[974],{"type":47,"value":975},"Cookies",{"type":41,"tag":84,"props":977,"children":979},{"className":86,"code":978,"language":20,"meta":88,"style":88},"import \"net\u002Fhttp\"\n\ntype AuthParams struct {\n    SessionCookie *http.Cookie `cookie:\"session\"`\n    CSRFToken     string       `header:\"X-CSRF-Token\"`\n}\n\n\u002F\u002Fencore:api auth method=POST path=\u002Flogout\nfunc Logout(ctx context.Context, params *AuthParams) error {\n    \u002F\u002F Access params.SessionCookie.Value\n    return nil\n}\n",[980],{"type":41,"tag":75,"props":981,"children":982},{"__ignoreMap":88},[983,991,998,1006,1014,1022,1029,1036,1044,1052,1060,1068],{"type":41,"tag":94,"props":984,"children":985},{"class":96,"line":97},[986],{"type":41,"tag":94,"props":987,"children":988},{},[989],{"type":47,"value":990},"import \"net\u002Fhttp\"\n",{"type":41,"tag":94,"props":992,"children":993},{"class":96,"line":106},[994],{"type":41,"tag":94,"props":995,"children":996},{"emptyLinePlaceholder":110},[997],{"type":47,"value":113},{"type":41,"tag":94,"props":999,"children":1000},{"class":96,"line":116},[1001],{"type":41,"tag":94,"props":1002,"children":1003},{},[1004],{"type":47,"value":1005},"type AuthParams struct {\n",{"type":41,"tag":94,"props":1007,"children":1008},{"class":96,"line":125},[1009],{"type":41,"tag":94,"props":1010,"children":1011},{},[1012],{"type":47,"value":1013},"    SessionCookie *http.Cookie `cookie:\"session\"`\n",{"type":41,"tag":94,"props":1015,"children":1016},{"class":96,"line":25},[1017],{"type":41,"tag":94,"props":1018,"children":1019},{},[1020],{"type":47,"value":1021},"    CSRFToken     string       `header:\"X-CSRF-Token\"`\n",{"type":41,"tag":94,"props":1023,"children":1024},{"class":96,"line":141},[1025],{"type":41,"tag":94,"props":1026,"children":1027},{},[1028],{"type":47,"value":156},{"type":41,"tag":94,"props":1030,"children":1031},{"class":96,"line":150},[1032],{"type":41,"tag":94,"props":1033,"children":1034},{"emptyLinePlaceholder":110},[1035],{"type":47,"value":113},{"type":41,"tag":94,"props":1037,"children":1038},{"class":96,"line":159},[1039],{"type":41,"tag":94,"props":1040,"children":1041},{},[1042],{"type":47,"value":1043},"\u002F\u002Fencore:api auth method=POST path=\u002Flogout\n",{"type":41,"tag":94,"props":1045,"children":1046},{"class":96,"line":167},[1047],{"type":41,"tag":94,"props":1048,"children":1049},{},[1050],{"type":47,"value":1051},"func Logout(ctx context.Context, params *AuthParams) error {\n",{"type":41,"tag":94,"props":1053,"children":1054},{"class":96,"line":176},[1055],{"type":41,"tag":94,"props":1056,"children":1057},{},[1058],{"type":47,"value":1059},"    \u002F\u002F Access params.SessionCookie.Value\n",{"type":41,"tag":94,"props":1061,"children":1062},{"class":96,"line":185},[1063],{"type":41,"tag":94,"props":1064,"children":1065},{},[1066],{"type":47,"value":1067},"    return nil\n",{"type":41,"tag":94,"props":1069,"children":1070},{"class":96,"line":194},[1071],{"type":41,"tag":94,"props":1072,"children":1073},{},[1074],{"type":47,"value":156},{"type":41,"tag":50,"props":1076,"children":1078},{"id":1077},"response-types",[1079],{"type":47,"value":1080},"Response Types",{"type":41,"tag":63,"props":1082,"children":1084},{"id":1083},"standard-response",[1085],{"type":47,"value":1086},"Standard Response",{"type":41,"tag":84,"props":1088,"children":1090},{"className":86,"code":1089,"language":20,"meta":88,"style":88},"type Response struct {\n    Message string `json:\"message\"`\n}\n\n\u002F\u002Fencore:api public method=GET path=\u002Fhello\nfunc Hello(ctx context.Context) (*Response, error) {\n    return &Response{Message: \"Hello, World!\"}, nil\n}\n",[1091],{"type":41,"tag":75,"props":1092,"children":1093},{"__ignoreMap":88},[1094,1102,1110,1117,1124,1132,1140,1148],{"type":41,"tag":94,"props":1095,"children":1096},{"class":96,"line":97},[1097],{"type":41,"tag":94,"props":1098,"children":1099},{},[1100],{"type":47,"value":1101},"type Response struct {\n",{"type":41,"tag":94,"props":1103,"children":1104},{"class":96,"line":106},[1105],{"type":41,"tag":94,"props":1106,"children":1107},{},[1108],{"type":47,"value":1109},"    Message string `json:\"message\"`\n",{"type":41,"tag":94,"props":1111,"children":1112},{"class":96,"line":116},[1113],{"type":41,"tag":94,"props":1114,"children":1115},{},[1116],{"type":47,"value":156},{"type":41,"tag":94,"props":1118,"children":1119},{"class":96,"line":125},[1120],{"type":41,"tag":94,"props":1121,"children":1122},{"emptyLinePlaceholder":110},[1123],{"type":47,"value":113},{"type":41,"tag":94,"props":1125,"children":1126},{"class":96,"line":25},[1127],{"type":41,"tag":94,"props":1128,"children":1129},{},[1130],{"type":47,"value":1131},"\u002F\u002Fencore:api public method=GET path=\u002Fhello\n",{"type":41,"tag":94,"props":1133,"children":1134},{"class":96,"line":141},[1135],{"type":41,"tag":94,"props":1136,"children":1137},{},[1138],{"type":47,"value":1139},"func Hello(ctx context.Context) (*Response, error) {\n",{"type":41,"tag":94,"props":1141,"children":1142},{"class":96,"line":150},[1143],{"type":41,"tag":94,"props":1144,"children":1145},{},[1146],{"type":47,"value":1147},"    return &Response{Message: \"Hello, World!\"}, nil\n",{"type":41,"tag":94,"props":1149,"children":1150},{"class":96,"line":159},[1151],{"type":41,"tag":94,"props":1152,"children":1153},{},[1154],{"type":47,"value":156},{"type":41,"tag":63,"props":1156,"children":1158},{"id":1157},"no-response-body",[1159],{"type":47,"value":1160},"No Response Body",{"type":41,"tag":84,"props":1162,"children":1164},{"className":86,"code":1163,"language":20,"meta":88,"style":88},"\u002F\u002Fencore:api public method=DELETE path=\u002Fusers\u002F:id\nfunc DeleteUser(ctx context.Context, params *DeleteParams) error {\n    \u002F\u002F Return only error (no response body on success)\n    return nil\n}\n",[1165],{"type":41,"tag":75,"props":1166,"children":1167},{"__ignoreMap":88},[1168,1176,1184,1192,1199],{"type":41,"tag":94,"props":1169,"children":1170},{"class":96,"line":97},[1171],{"type":41,"tag":94,"props":1172,"children":1173},{},[1174],{"type":47,"value":1175},"\u002F\u002Fencore:api public method=DELETE path=\u002Fusers\u002F:id\n",{"type":41,"tag":94,"props":1177,"children":1178},{"class":96,"line":106},[1179],{"type":41,"tag":94,"props":1180,"children":1181},{},[1182],{"type":47,"value":1183},"func DeleteUser(ctx context.Context, params *DeleteParams) error {\n",{"type":41,"tag":94,"props":1185,"children":1186},{"class":96,"line":116},[1187],{"type":41,"tag":94,"props":1188,"children":1189},{},[1190],{"type":47,"value":1191},"    \u002F\u002F Return only error (no response body on success)\n",{"type":41,"tag":94,"props":1193,"children":1194},{"class":96,"line":125},[1195],{"type":41,"tag":94,"props":1196,"children":1197},{},[1198],{"type":47,"value":1067},{"type":41,"tag":94,"props":1200,"children":1201},{"class":96,"line":25},[1202],{"type":41,"tag":94,"props":1203,"children":1204},{},[1205],{"type":47,"value":156},{"type":41,"tag":63,"props":1207,"children":1209},{"id":1208},"no-request-parameters",[1210],{"type":47,"value":1211},"No Request Parameters",{"type":41,"tag":84,"props":1213,"children":1215},{"className":86,"code":1214,"language":20,"meta":88,"style":88},"\u002F\u002Fencore:api public method=GET path=\u002Fhealth\nfunc Health(ctx context.Context) (*HealthResponse, error) {\n    return &HealthResponse{Status: \"ok\"}, nil\n}\n",[1216],{"type":41,"tag":75,"props":1217,"children":1218},{"__ignoreMap":88},[1219,1226,1234,1242],{"type":41,"tag":94,"props":1220,"children":1221},{"class":96,"line":97},[1222],{"type":41,"tag":94,"props":1223,"children":1224},{},[1225],{"type":47,"value":544},{"type":41,"tag":94,"props":1227,"children":1228},{"class":96,"line":106},[1229],{"type":41,"tag":94,"props":1230,"children":1231},{},[1232],{"type":47,"value":1233},"func Health(ctx context.Context) (*HealthResponse, error) {\n",{"type":41,"tag":94,"props":1235,"children":1236},{"class":96,"line":116},[1237],{"type":41,"tag":94,"props":1238,"children":1239},{},[1240],{"type":47,"value":1241},"    return &HealthResponse{Status: \"ok\"}, nil\n",{"type":41,"tag":94,"props":1243,"children":1244},{"class":96,"line":125},[1245],{"type":41,"tag":94,"props":1246,"children":1247},{},[1248],{"type":47,"value":156},{"type":41,"tag":50,"props":1250,"children":1252},{"id":1251},"error-handling",[1253],{"type":47,"value":1254},"Error Handling",{"type":41,"tag":57,"props":1256,"children":1257},{},[1258,1260,1266],{"type":47,"value":1259},"Use ",{"type":41,"tag":75,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":47,"value":1265},"errs",{"type":47,"value":1267}," package for proper HTTP error responses:",{"type":41,"tag":84,"props":1269,"children":1271},{"className":86,"code":1270,"language":20,"meta":88,"style":88},"import \"encore.dev\u002Fbeta\u002Ferrs\"\n\n\u002F\u002Fencore:api public method=GET path=\u002Fusers\u002F:id\nfunc GetUser(ctx context.Context, params *GetUserParams) (*User, error) {\n    user, err := findUser(params.ID)\n    if err != nil {\n        return nil, err\n    }\n    if user == nil {\n        return nil, &errs.Error{\n            Code:    errs.NotFound,\n            Message: \"user not found\",\n        }\n    }\n    return user, nil\n}\n",[1272],{"type":41,"tag":75,"props":1273,"children":1274},{"__ignoreMap":88},[1275,1283,1290,1297,1304,1312,1320,1328,1336,1344,1352,1360,1368,1376,1383,1391],{"type":41,"tag":94,"props":1276,"children":1277},{"class":96,"line":97},[1278],{"type":41,"tag":94,"props":1279,"children":1280},{},[1281],{"type":47,"value":1282},"import \"encore.dev\u002Fbeta\u002Ferrs\"\n",{"type":41,"tag":94,"props":1284,"children":1285},{"class":96,"line":106},[1286],{"type":41,"tag":94,"props":1287,"children":1288},{"emptyLinePlaceholder":110},[1289],{"type":47,"value":113},{"type":41,"tag":94,"props":1291,"children":1292},{"class":96,"line":116},[1293],{"type":41,"tag":94,"props":1294,"children":1295},{},[1296],{"type":47,"value":225},{"type":41,"tag":94,"props":1298,"children":1299},{"class":96,"line":125},[1300],{"type":41,"tag":94,"props":1301,"children":1302},{},[1303],{"type":47,"value":234},{"type":41,"tag":94,"props":1305,"children":1306},{"class":96,"line":25},[1307],{"type":41,"tag":94,"props":1308,"children":1309},{},[1310],{"type":47,"value":1311},"    user, err := findUser(params.ID)\n",{"type":41,"tag":94,"props":1313,"children":1314},{"class":96,"line":141},[1315],{"type":41,"tag":94,"props":1316,"children":1317},{},[1318],{"type":47,"value":1319},"    if err != nil {\n",{"type":41,"tag":94,"props":1321,"children":1322},{"class":96,"line":150},[1323],{"type":41,"tag":94,"props":1324,"children":1325},{},[1326],{"type":47,"value":1327},"        return nil, err\n",{"type":41,"tag":94,"props":1329,"children":1330},{"class":96,"line":159},[1331],{"type":41,"tag":94,"props":1332,"children":1333},{},[1334],{"type":47,"value":1335},"    }\n",{"type":41,"tag":94,"props":1337,"children":1338},{"class":96,"line":167},[1339],{"type":41,"tag":94,"props":1340,"children":1341},{},[1342],{"type":47,"value":1343},"    if user == nil {\n",{"type":41,"tag":94,"props":1345,"children":1346},{"class":96,"line":176},[1347],{"type":41,"tag":94,"props":1348,"children":1349},{},[1350],{"type":47,"value":1351},"        return nil, &errs.Error{\n",{"type":41,"tag":94,"props":1353,"children":1354},{"class":96,"line":185},[1355],{"type":41,"tag":94,"props":1356,"children":1357},{},[1358],{"type":47,"value":1359},"            Code:    errs.NotFound,\n",{"type":41,"tag":94,"props":1361,"children":1362},{"class":96,"line":194},[1363],{"type":41,"tag":94,"props":1364,"children":1365},{},[1366],{"type":47,"value":1367},"            Message: \"user not found\",\n",{"type":41,"tag":94,"props":1369,"children":1370},{"class":96,"line":203},[1371],{"type":41,"tag":94,"props":1372,"children":1373},{},[1374],{"type":47,"value":1375},"        }\n",{"type":41,"tag":94,"props":1377,"children":1378},{"class":96,"line":211},[1379],{"type":41,"tag":94,"props":1380,"children":1381},{},[1382],{"type":47,"value":1335},{"type":41,"tag":94,"props":1384,"children":1385},{"class":96,"line":219},[1386],{"type":41,"tag":94,"props":1387,"children":1388},{},[1389],{"type":47,"value":1390},"    return user, nil\n",{"type":41,"tag":94,"props":1392,"children":1393},{"class":96,"line":228},[1394],{"type":41,"tag":94,"props":1395,"children":1396},{},[1397],{"type":47,"value":156},{"type":41,"tag":63,"props":1399,"children":1401},{"id":1400},"common-error-codes",[1402],{"type":47,"value":1403},"Common Error Codes",{"type":41,"tag":355,"props":1405,"children":1406},{},[1407,1428],{"type":41,"tag":359,"props":1408,"children":1409},{},[1410],{"type":41,"tag":363,"props":1411,"children":1412},{},[1413,1418,1423],{"type":41,"tag":367,"props":1414,"children":1415},{},[1416],{"type":47,"value":1417},"Code",{"type":41,"tag":367,"props":1419,"children":1420},{},[1421],{"type":47,"value":1422},"HTTP Status",{"type":41,"tag":367,"props":1424,"children":1425},{},[1426],{"type":47,"value":1427},"Usage",{"type":41,"tag":383,"props":1429,"children":1430},{},[1431,1453,1475,1497,1519],{"type":41,"tag":363,"props":1432,"children":1433},{},[1434,1443,1448],{"type":41,"tag":390,"props":1435,"children":1436},{},[1437],{"type":41,"tag":75,"props":1438,"children":1440},{"className":1439},[],[1441],{"type":47,"value":1442},"errs.NotFound",{"type":41,"tag":390,"props":1444,"children":1445},{},[1446],{"type":47,"value":1447},"404",{"type":41,"tag":390,"props":1449,"children":1450},{},[1451],{"type":47,"value":1452},"Resource doesn't exist",{"type":41,"tag":363,"props":1454,"children":1455},{},[1456,1465,1470],{"type":41,"tag":390,"props":1457,"children":1458},{},[1459],{"type":41,"tag":75,"props":1460,"children":1462},{"className":1461},[],[1463],{"type":47,"value":1464},"errs.InvalidArgument",{"type":41,"tag":390,"props":1466,"children":1467},{},[1468],{"type":47,"value":1469},"400",{"type":41,"tag":390,"props":1471,"children":1472},{},[1473],{"type":47,"value":1474},"Bad input",{"type":41,"tag":363,"props":1476,"children":1477},{},[1478,1487,1492],{"type":41,"tag":390,"props":1479,"children":1480},{},[1481],{"type":41,"tag":75,"props":1482,"children":1484},{"className":1483},[],[1485],{"type":47,"value":1486},"errs.Unauthenticated",{"type":41,"tag":390,"props":1488,"children":1489},{},[1490],{"type":47,"value":1491},"401",{"type":41,"tag":390,"props":1493,"children":1494},{},[1495],{"type":47,"value":1496},"Missing\u002Finvalid auth",{"type":41,"tag":363,"props":1498,"children":1499},{},[1500,1509,1514],{"type":41,"tag":390,"props":1501,"children":1502},{},[1503],{"type":41,"tag":75,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":47,"value":1508},"errs.PermissionDenied",{"type":41,"tag":390,"props":1510,"children":1511},{},[1512],{"type":47,"value":1513},"403",{"type":41,"tag":390,"props":1515,"children":1516},{},[1517],{"type":47,"value":1518},"Not allowed",{"type":41,"tag":363,"props":1520,"children":1521},{},[1522,1531,1536],{"type":41,"tag":390,"props":1523,"children":1524},{},[1525],{"type":41,"tag":75,"props":1526,"children":1528},{"className":1527},[],[1529],{"type":47,"value":1530},"errs.AlreadyExists",{"type":41,"tag":390,"props":1532,"children":1533},{},[1534],{"type":47,"value":1535},"409",{"type":41,"tag":390,"props":1537,"children":1538},{},[1539],{"type":47,"value":1540},"Duplicate resource",{"type":41,"tag":50,"props":1542,"children":1544},{"id":1543},"guidelines",[1545],{"type":47,"value":1546},"Guidelines",{"type":41,"tag":1548,"props":1549,"children":1550},"ul",{},[1551,1563,1568,1573,1586,1591],{"type":41,"tag":1552,"props":1553,"children":1554},"li",{},[1555,1556,1561],{"type":47,"value":1259},{"type":41,"tag":75,"props":1557,"children":1559},{"className":1558},[],[1560],{"type":47,"value":80},{"type":47,"value":1562}," annotation above the function",{"type":41,"tag":1552,"props":1564,"children":1565},{},[1566],{"type":47,"value":1567},"Request params must be a pointer to a struct or omitted",{"type":41,"tag":1552,"props":1569,"children":1570},{},[1571],{"type":47,"value":1572},"Response must be a pointer to a struct (or omit for no body)",{"type":41,"tag":1552,"props":1574,"children":1575},{},[1576,1578,1584],{"type":47,"value":1577},"Always return ",{"type":41,"tag":75,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":47,"value":1583},"error",{"type":47,"value":1585}," as the last return value",{"type":41,"tag":1552,"props":1587,"children":1588},{},[1589],{"type":47,"value":1590},"Use struct tags for JSON field names, query params, and headers",{"type":41,"tag":1552,"props":1592,"children":1593},{},[1594],{"type":47,"value":1595},"Path parameters are automatically mapped to struct fields by name",{"type":41,"tag":1597,"props":1598,"children":1599},"style",{},[1600],{"type":47,"value":1601},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1603,"total":1704},[1604,1616,1627,1645,1661,1673,1689],{"slug":1605,"name":1605,"fn":1606,"description":1607,"org":1608,"tags":1609,"stars":21,"repoUrl":22,"updatedAt":1615},"encore-api","build type-safe APIs with Encore","Define typed API endpoints in Encore.ts using `api(...)` from `encore.dev\u002Fapi`. Covers typed request\u002Fresponse interfaces, path\u002Fquery\u002Fheader\u002Fcookie params, request validation, and `APIError`. For raw endpoints (`api.raw()`) and inbound webhooks, use `encore-webhook` instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1610,1611,1612],{"name":16,"slug":17,"type":14},{"name":9,"slug":8,"type":14},{"name":1613,"slug":1614,"type":14},"TypeScript","typescript","2026-04-06T18:09:46.044101",{"slug":1617,"name":1617,"fn":1618,"description":1619,"org":1620,"tags":1621,"stars":21,"repoUrl":22,"updatedAt":1626},"encore-auth","implement Encore.ts authentication","Protect Encore.ts endpoints with authentication and authorize callers. Covers `authHandler`, `Gateway`, `getAuthData`, and `auth: true`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1622,1624,1625],{"name":1623,"slug":441,"type":14},"Auth",{"name":9,"slug":8,"type":14},{"name":1613,"slug":1614,"type":14},"2026-04-06T18:09:47.336322",{"slug":1628,"name":1628,"fn":1629,"description":1630,"org":1631,"tags":1632,"stars":21,"repoUrl":22,"updatedAt":1644},"encore-bucket","store files in Encore.ts buckets","Store unstructured files in Encore.ts using `Bucket` from `encore.dev\u002Fstorage\u002Fobjects` — uploads, images, documents, blobs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1633,1636,1637,1640,1643],{"name":1634,"slug":1635,"type":14},"Backend","backend",{"name":9,"slug":8,"type":14},{"name":1638,"slug":1639,"type":14},"File Storage","file-storage",{"name":1641,"slug":1642,"type":14},"File Uploads","file-uploads",{"name":1613,"slug":1614,"type":14},"2026-05-16T05:59:52.813772",{"slug":1646,"name":1646,"fn":1647,"description":1648,"org":1649,"tags":1650,"stars":21,"repoUrl":22,"updatedAt":1660},"encore-cache","cache data in Redis with Encore.ts","Cache data in Redis from Encore.ts using `CacheCluster` and typed keyspaces from `encore.dev\u002Fstorage\u002Fcache`. Type-safe key\u002Fvalue access with TTLs, atomic increments, and per-keyspace data shapes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1651,1652,1655,1656,1659],{"name":1634,"slug":1635,"type":14},{"name":1653,"slug":1654,"type":14},"Caching","caching",{"name":9,"slug":8,"type":14},{"name":1657,"slug":1658,"type":14},"Redis","redis",{"name":1613,"slug":1614,"type":14},"2026-05-16T05:59:56.808328",{"slug":1662,"name":1662,"fn":1663,"description":1664,"org":1665,"tags":1666,"stars":21,"repoUrl":22,"updatedAt":1672},"encore-code-review","review Encore.ts code","Review existing Encore.ts code for best practices and common anti-patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1667,1670,1671],{"name":1668,"slug":1669,"type":14},"Code Review","code-review",{"name":9,"slug":8,"type":14},{"name":1613,"slug":1614,"type":14},"2026-04-06T18:10:01.123999",{"slug":1674,"name":1674,"fn":1675,"description":1676,"org":1677,"tags":1678,"stars":21,"repoUrl":22,"updatedAt":1688},"encore-cron","schedule recurring jobs in Encore.ts","Schedule periodic \u002F recurring work in Encore.ts using `CronJob` from `encore.dev\u002Fcron`. Covers `every: \"1h\"` interval syntax and `schedule: \"0 9 * * 1\"` cron expressions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1679,1682,1683,1684,1687],{"name":1680,"slug":1681,"type":14},"Automation","automation",{"name":1634,"slug":1635,"type":14},{"name":9,"slug":8,"type":14},{"name":1685,"slug":1686,"type":14},"Scheduling","scheduling",{"name":1613,"slug":1614,"type":14},"2026-05-16T05:59:54.146651",{"slug":1690,"name":1690,"fn":1691,"description":1692,"org":1693,"tags":1694,"stars":21,"repoUrl":22,"updatedAt":1703},"encore-database","build Encore databases","Work with PostgreSQL in Encore.ts using `SQLDatabase` from `encore.dev\u002Fstorage\u002Fsqldb` — schema migrations and SQL queries.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1695,1698,1699,1702],{"name":1696,"slug":1697,"type":14},"Database","database",{"name":9,"slug":8,"type":14},{"name":1700,"slug":1701,"type":14},"ORM","orm",{"name":1613,"slug":1614,"type":14},"2026-04-06T18:09:54.823017",28,{"items":1706,"total":1704},[1707,1713,1719,1727,1735,1741,1749,1756,1773,1790,1796,1807],{"slug":1605,"name":1605,"fn":1606,"description":1607,"org":1708,"tags":1709,"stars":21,"repoUrl":22,"updatedAt":1615},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1710,1711,1712],{"name":16,"slug":17,"type":14},{"name":9,"slug":8,"type":14},{"name":1613,"slug":1614,"type":14},{"slug":1617,"name":1617,"fn":1618,"description":1619,"org":1714,"tags":1715,"stars":21,"repoUrl":22,"updatedAt":1626},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1716,1717,1718],{"name":1623,"slug":441,"type":14},{"name":9,"slug":8,"type":14},{"name":1613,"slug":1614,"type":14},{"slug":1628,"name":1628,"fn":1629,"description":1630,"org":1720,"tags":1721,"stars":21,"repoUrl":22,"updatedAt":1644},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1722,1723,1724,1725,1726],{"name":1634,"slug":1635,"type":14},{"name":9,"slug":8,"type":14},{"name":1638,"slug":1639,"type":14},{"name":1641,"slug":1642,"type":14},{"name":1613,"slug":1614,"type":14},{"slug":1646,"name":1646,"fn":1647,"description":1648,"org":1728,"tags":1729,"stars":21,"repoUrl":22,"updatedAt":1660},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1730,1731,1732,1733,1734],{"name":1634,"slug":1635,"type":14},{"name":1653,"slug":1654,"type":14},{"name":9,"slug":8,"type":14},{"name":1657,"slug":1658,"type":14},{"name":1613,"slug":1614,"type":14},{"slug":1662,"name":1662,"fn":1663,"description":1664,"org":1736,"tags":1737,"stars":21,"repoUrl":22,"updatedAt":1672},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1738,1739,1740],{"name":1668,"slug":1669,"type":14},{"name":9,"slug":8,"type":14},{"name":1613,"slug":1614,"type":14},{"slug":1674,"name":1674,"fn":1675,"description":1676,"org":1742,"tags":1743,"stars":21,"repoUrl":22,"updatedAt":1688},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1744,1745,1746,1747,1748],{"name":1680,"slug":1681,"type":14},{"name":1634,"slug":1635,"type":14},{"name":9,"slug":8,"type":14},{"name":1685,"slug":1686,"type":14},{"name":1613,"slug":1614,"type":14},{"slug":1690,"name":1690,"fn":1691,"description":1692,"org":1750,"tags":1751,"stars":21,"repoUrl":22,"updatedAt":1703},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1752,1753,1754,1755],{"name":1696,"slug":1697,"type":14},{"name":9,"slug":8,"type":14},{"name":1700,"slug":1701,"type":14},{"name":1613,"slug":1614,"type":14},{"slug":1757,"name":1757,"fn":1758,"description":1759,"org":1760,"tags":1761,"stars":21,"repoUrl":22,"updatedAt":1772},"encore-frontend","connect frontend to Encore backend","Connect a frontend application (React, Next.js, Vue, Svelte, etc.) to an Encore.ts backend.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1762,1763,1766,1769],{"name":9,"slug":8,"type":14},{"name":1764,"slug":1765,"type":14},"Frontend","frontend",{"name":1767,"slug":1768,"type":14},"Next.js","next-js",{"name":1770,"slug":1771,"type":14},"React","react","2026-04-06T18:09:56.091006",{"slug":1774,"name":1774,"fn":1775,"description":1776,"org":1777,"tags":1778,"stars":21,"repoUrl":22,"updatedAt":1789},"encore-getting-started","build and run applications with Encore.ts","Bootstrap a brand-new Encore.ts project from zero. Only for first-time CLI install and `encore app create` — not for architecture or feature questions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1779,1780,1781,1782,1785,1786],{"name":16,"slug":17,"type":14},{"name":1634,"slug":1635,"type":14},{"name":9,"slug":8,"type":14},{"name":1783,"slug":1784,"type":14},"Local Development","local-development",{"name":1613,"slug":1614,"type":14},{"name":1787,"slug":1788,"type":14},"Web Development","web-development","2026-04-06T18:10:04.885446",{"slug":4,"name":4,"fn":5,"description":6,"org":1791,"tags":1792,"stars":21,"repoUrl":22,"updatedAt":23},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1793,1794,1795],{"name":16,"slug":17,"type":14},{"name":9,"slug":8,"type":14},{"name":19,"slug":20,"type":14},{"slug":1797,"name":1797,"fn":1798,"description":1799,"org":1800,"tags":1801,"stars":21,"repoUrl":22,"updatedAt":1806},"encore-go-auth","implement authentication with Encore Go","Protect Encore Go endpoints with authentication and authorize callers. Covers `auth.AuthHandler`, `auth.UserID`, the `Authorization` header, and `\u002F\u002Fencore:api auth`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1802,1803,1804,1805],{"name":1623,"slug":441,"type":14},{"name":1634,"slug":1635,"type":14},{"name":9,"slug":8,"type":14},{"name":19,"slug":20,"type":14},"2026-04-06T18:09:51.065102",{"slug":1808,"name":1808,"fn":1809,"description":1810,"org":1811,"tags":1812,"stars":21,"repoUrl":22,"updatedAt":1820},"encore-go-bucket","store files in Encore Go buckets","Store unstructured files in Encore Go using `objects.NewBucket` from `encore.dev\u002Fstorage\u002Fobjects` — uploads, images, documents, blobs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1813,1814,1815,1816,1817],{"name":1634,"slug":1635,"type":14},{"name":9,"slug":8,"type":14},{"name":1638,"slug":1639,"type":14},{"name":19,"slug":20,"type":14},{"name":1818,"slug":1819,"type":14},"Storage","storage","2026-05-16T06:00:03.633918"]