Next.js Integration
Use Synap SDK in your Next.js applications with App Router or Pages Router.
Installation
npm install @synap/sdkSetup
Environment Variables
Create .env.local:
.env.local
SYNAP_URL=https://api.synap.app
SYNAP_API_KEY=sk_your_key_hereApp Router (Recommended)
Server Components
Use SDK directly in Server Components:
app/tasks/page.tsx
import { SynapSDK } from '@synap/sdk'
const synap = new SynapSDK({
url: process.env.SYNAP_URL!,
apiKey: process.env.SYNAP_API_KEY!
})
export default async function TasksPage() {
const tasks = await synap.entities.list({ type: 'task' })
return (
<div>
<h1>Tasks</h1>
<ul>
{tasks.map(task => (
<li key={task.id}>{task.title}</li>
))}
</ul>
</div>
)
}Client Components
Create an API route for client-side requests:
app/api/tasks/route.ts
import { SynapSDK } from '@synap/sdk'
import { NextResponse } from 'next/server'
const synap = new SynapSDK({
url: process.env.SYNAP_URL!,
apiKey: process.env.SYNAP_API_KEY!
})
export async function GET() {
const tasks = await synap.entities.list({ type: 'task' })
return NextResponse.json(tasks)
}
export async function POST(request: Request) {
const body = await request.json()
const { entityId } = await synap.entities.create({
type: 'task',
title: body.title,
metadata: body.metadata
})
return NextResponse.json({ entityId })
}Then use it in your client component:
app/tasks/create-task.tsx
'use client'
import { useState } from 'react'
export function CreateTask() {
const [title, setTitle] = useState('')
async function handleSubmit(e: React.FormEvent) {
e.preventDefault()
const response = await fetch('/api/tasks', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title })
})
const { entityId } = await response.json()
console.log('Created:', entityId)
setTitle('')
}
return (
<form onSubmit={handleSubmit}>
<input
value={title}
onChange={(e) => setTitle(e.target.value)}
placeholder="Task title"
/>
<button type="submit">Create Task</button>
</form>
)
}Pages Router
API Route
pages/api/tasks/[id].ts
import { SynapSDK } from '@synap/sdk'
import type { NextApiRequest, NextApiResponse } from 'next'
const synap = new SynapSDK({
url: process.env.SYNAP_URL!,
apiKey: process.env.SYNAP_API_KEY!
})
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
const { id } = req.query
if (req.method === 'GET') {
const entity = await synap.entities.get(id as string)
return res.json(entity)
}
if (req.method === 'PUT') {
await synap.entities.update(id as string, req.body)
return res.json({ success: true })
}
res.status(405).json({ error: 'Method not allowed' })
}Server-Side Rendering
pages/tasks/index.tsx
import { SynapSDK } from '@synap/sdk'
import type { GetServerSideProps } from 'next'
export const getServerSideProps: GetServerSideProps = async () => {
const synap = new SynapSDK({
url: process.env.SYNAP_URL!,
apiKey: process.env.SYNAP_API_KEY!
})
const tasks = await synap.entities.list({ type: 'task' })
return {
props: { tasks }
}
}
export default function TasksPage({ tasks }) {
return (
<div>
<h1>Tasks</h1>
<ul>
{tasks.map(task => (
<li key={task.id}>{task.title}</li>
))}
</ul>
</div>
)
}Best Practices
Singleton SDK Instance
Create a single SDK instance:
lib/synap.ts
import { SynapSDK } from '@synap/sdk'
export const synap = new SynapSDK({
url: process.env.SYNAP_URL!,
apiKey: process.env.SYNAP_API_KEY!
})Import it everywhere:
import { synap } from '@/lib/synap'Error Handling
app/api/tasks/route.ts
import { synap } from '@/lib/synap'
import { NextResponse } from 'next/server'
export async function GET() {
try {
const tasks = await synap.entities.list({ type: 'task' })
return NextResponse.json(tasks)
} catch (error) {
console.error('Failed to fetch tasks:', error)
return NextResponse.json(
{ error: 'Failed to fetch tasks' },
{ status: 500 }
)
}
}TypeScript
Enable strict mode in tsconfig.json:
{
"compilerOptions": {
"strict": true
}
}The SDK is fully typed:
import type { Entity, EntityType } from '@synap/sdk'
const entity: Entity<'task'> = await synap.entities.get(id)
// entity.metadata is typed based on 'task' typeExamples
Full CRUD Example
app/api/tasks/route.ts
import { synap } from '@/lib/synap'
import { NextResponse } from 'next/server'
// List
export async function GET() {
const tasks = await synap.entities.list({
type: 'task',
limit: 50
})
return NextResponse.json(tasks)
}
// Create
export async function POST(request: Request) {
const body = await request.json()
const { entityId } = await synap.entities.create({
type: 'task',
title: body.title,
metadata: {
priority: body.priority,
dueDate: body.dueDate
}
})
return NextResponse.json({ entityId })
}app/api/tasks/[id]/route.ts
import { synap } from '@/lib/synap'
import { NextResponse } from 'next/server'
// Get
export async function GET(
request: Request,
{ params }: { params: { id: string } }
) {
const entity = await synap.entities.get(params.id)
return NextResponse.json(entity)
}
// Update
export async function PUT(
request: Request,
{ params }: { params: { id: string } }
) {
const body = await request.json()
await synap.entities.update(params.id, body)
return NextResponse.json({ success: true })
}
// Delete
export async function DELETE(
request: Request,
{ params }: { params: { id: string } }
) {
await synap.entities.delete(params.id)
return NextResponse.json({ success: true })
}Next Steps
Last updated on