{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"gRPC vs REST"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"grpc-vs-rest","__idx":0},"children":["gRPC vs REST"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The PartnerAPI supports connecting via gRPC by default; this allows partners to auto-generate an SDK in their language of choice, and to connect normally via a Connect RPC HTTPS proxy. However, we can open a REST API connection for partners upon request."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"generating-the-connect-rpc-client","__idx":1},"children":["Generating the Connect RPC Client"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you would like to connect to the gRPC endpoints using an HTTPS proxy, a ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://connectrpc.com/"},"children":["Connect RPC"]}," client can be generated as follows:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Install dependencies:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"brew install node grpcurl bufbuild/buf/buf\nnpm install @bufbuild/protoc-gen-es @bufbuild/protobuf @connectrpc/connect @connectrpc/connect-node\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use grpcurl to generate .proto files:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"grpcurl \\\n    -proto-out-dir basic-capital-protos/ \\\n    partnerapi.basiccapital.dev:443 \\\n    list\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create a buf configuration file:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"version: v2\ninputs:\n- directory: basic-capital-protos/\nplugins:\n- local: protoc-gen-es\n  opt: target=ts\n  out: basic-capital-protos\n","lang":"yaml"},"children":[]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["npx buf generate"]}," (this generates ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["_pb.ts"]}," files alongside the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".proto"]}," files in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["basic-capital-protos/"]},")"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Verify it works with a simple client:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"tsx","header":{"controls":{"copy":{}}},"source":"import { createClient } from \"@connectrpc/connect\";\nimport { createConnectTransport, createGrpcTransport } from \"@connectrpc/connect-node\";\nimport { PartnerAuthIngressService } from \"./basic-capital-protos/com/basiccapital/systems/ingress/partner/partner_auth_ingress_service_pb\";\nimport { EmployerCompanyIngressService } from \"./basic-capital-protos/com/basiccapital/systems/ingress/employer/company_ingress_service_pb\";\nimport { EmployerPlanConfigIngressService } from \"./basic-capital-protos/com/basiccapital/systems/ingress/employer/plan_config_ingress_service_pb\";\n\nfunction makeTransport(interceptors?: Parameters<typeof createGrpcTransport>[0][\"interceptors\"]) {\n  return createConnectTransport({\n    baseUrl: \"https://api.basiccapital.dev/v1/partner-rpc/\",\n    interceptors,\n  });\n}\n\nconst transport = makeTransport();\n\nconst authClient = createClient(PartnerAuthIngressService, transport);\n\nconst response = await authClient.exchangeApiKey({\n  apiKey: \"PARTNER_API_KEY\",\n});\n\nconst authToken = response.authToken;\nconsole.log(\"Fetched auth token\");\n","lang":"tsx"},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"rest-apis","__idx":2},"children":["REST APIs"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Authorization and payroll endpoints are already available via REST. Full documentation for the REST API is coming soon."]}]},"headings":[{"value":"gRPC vs REST","id":"grpc-vs-rest","depth":1},{"value":"Generating the Connect RPC Client","id":"generating-the-connect-rpc-client","depth":1},{"value":"REST APIs","id":"rest-apis","depth":1}],"frontmatter":{"title":"gRPC vs REST","seo":{"title":"gRPC vs REST"}},"lastModified":"2026-09-14T19:48:02.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/integration-guide/grpc-vs-rest","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}