> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# SDK Go Didit untuk KYC, AML, dan Transaksi

> Panduan cepat SDK Go resmi Didit: panggilan API bertipe dengan standard library saja, verifikasi webhook, dan pemeriksaan token.

Modul resmi Didit untuk Go. Modul ini membutuhkan Go 1.22 atau yang lebih baru dan hanya menggunakan pustaka standar. Lihat [ikhtisar SDK server](https://docs.didit.me/id/integration/server-sdks/overview.md) untuk mengetahui hal yang dimiliki bersama oleh setiap SDK.

## Instalasi

```bash theme={null}
go get github.com/didit-protocol/sdk-go
```

Modul ini ada di [`github.com/didit-protocol/sdk-go` di pkg.go.dev](https://pkg.go.dev/github.com/didit-protocol/sdk-go). Sumber dan catatan perubahannya ada di [didit-protocol/sdk-go](https://github.com/didit-protocol/sdk-go) di GitHub.

Paketnya bernama `didit`. Webhook berada di `github.com/didit-protocol/sdk-go/webhook`, Authentication di `.../authentication`, dan opsi klien di `.../option`.

Contoh pada setiap halaman [referensi API](https://docs.didit.me/id/api-reference/overview.md) berupa isi dari sebuah fungsi. Contoh tersebut menggunakan `context`, `fmt` dan `log` dari pustaka standar serta modul ini.

## Konfigurasi klien

`didit.NewClient()` membaca `DIDIT_API_KEY` dari lingkungan. Berikan opsi untuk menimpanya, atau untuk mengatur ID organisasi dan aplikasi yang dibutuhkan panggilan dengan cakupan aplikasi (kasus, jaringan, laporan regulasi). Setiap opsi juga dapat dipakai pada satu panggilan saja.

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"time"

	"github.com/didit-protocol/sdk-go"
	"github.com/didit-protocol/sdk-go/option"
)

func main() {
	client := didit.NewClient(
		option.WithAPIKey(os.Getenv("DIDIT_API_KEY")),
		option.WithOrganizationID(os.Getenv("DIDIT_ORGANIZATION_ID")),
		option.WithApplicationID(os.Getenv("DIDIT_APPLICATION_ID")),
		option.WithTimeout(30*time.Second),
		option.WithMaxRetries(2),
	)

	// Options for a single call.
	decision, err := client.Sessions.RetrieveDecision(context.Background(), "11111111-2222-3333-4444-555555555555",
		didit.SessionsRetrieveDecisionParams{}, option.WithTimeout(5*time.Second))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(decision.Status)
}
```

Kolom permintaan yang bersifat opsional adalah nilai `didit.Opt`. Isi kolom tersebut dengan `didit.String`, `didit.Int`, `didit.Bool`, `didit.Float` atau `didit.Some`, atau biarkan kosong agar tidak ada yang dikirim.

## Membuat sesi

Buat [sesi verifikasi](https://docs.didit.me/id/sessions-api/create-session.md) untuk sebuah alur kerja, lalu arahkan pengguna Anda ke URL-nya.

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	session, err := client.Sessions.Create(context.Background(), didit.SessionsCreateParams{
		WorkflowID: "11111111-2222-3333-4444-555555555555",
		VendorData: didit.String("user-123"),
		Callback:   didit.String("https://example.com/verification/done"),
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(session.URL)
}
```

## Membaca keputusan

Saat pengguna selesai (atau saat webhook diterima), [baca keputusannya](https://docs.didit.me/id/sessions-api/retrieve-session.md). Setiap hasil fitur berupa slice dengan satu entri untuk setiap node alur kerja.

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	decision, err := client.Sessions.RetrieveDecision(context.Background(), "11111111-2222-3333-4444-555555555555",
		didit.SessionsRetrieveDecisionParams{})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(decision.Status)
	for _, verification := range decision.IDVerifications {
		fmt.Println(verification.Status)
	}
}
```

## Memverifikasi webhook

Berikan byte isi mentah dan header permintaan. `webhook.Verify` mengembalikan `*didit.WebhookVerificationError` untuk setiap pengiriman yang tidak valid atau sudah kedaluwarsa, dan mengembalikan event bertipe jika pengiriman valid.

```go theme={null}
package main

import (
	"errors"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"

	"github.com/didit-protocol/sdk-go"
	"github.com/didit-protocol/sdk-go/webhook"
)

func main() {
	secret := os.Getenv("DIDIT_WEBHOOK_SECRET")
	http.HandleFunc("POST /webhooks/didit", func(w http.ResponseWriter, r *http.Request) {
		body, err := io.ReadAll(http.MaxBytesReader(w, r.Body, 1<<20))
		if err != nil {
			http.Error(w, "bad body", http.StatusBadRequest)
			return
		}
		event, err := webhook.Verify(body, r.Header, secret)
		var invalid *didit.WebhookVerificationError
		if errors.As(err, &invalid) {
			http.Error(w, string(invalid.Reason), http.StatusBadRequest)
			return
		} else if err != nil {
			http.Error(w, "error", http.StatusInternalServerError)
			return
		}
		if e, ok := event.(*webhook.StatusUpdatedEvent); ok {
			fmt.Println(e.SessionID, e.Status)
		}
		w.WriteHeader(http.StatusOK)
	})
	log.Fatal(http.ListenAndServe(":8080", nil))
}
```

Selama Anda merotasi rahasia, tambahkan rahasia lama dengan `webhook.WithSecrets`. Lihat [Webhook](https://docs.didit.me/id/integration/webhooks.md) untuk event dan skema tanda tangannya.

## Melakukan skrining transaksi

Kirim pembayaran, penarikan, atau transfer kripto ke [Pemantauan Transaksi](https://docs.didit.me/id/transaction-monitoring/overview.md). Respons memuat status dan skor risikonya.

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	transaction, err := client.Transactions.Create(context.Background(), didit.TransactionsCreateParams{
		TransactionID:       "txn-1001",
		TransactionCategory: "finance",
		TransactionDetails: didit.TransactionsCreateParamsTransactionDetails{
			Direction: "outbound",
			Amount:    1500,
			Currency:  "EUR",
		},
		Subject: didit.TransactionsCreateParamsSubject{
			EntityType: didit.String("individual"),
			VendorData: "user-123",
			FullName:   "Maria Garcia",
		},
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(transaction.Status, transaction.Score)
}
```

## Memverifikasi token Authentication

Paket `authentication` memeriksa token akses yang ditandatangani oleh penerbit [Authentication](https://docs.didit.me/id/authentication/overview.md) Anda, di backend Anda, tanpa memanggil Didit untuk setiap permintaan. Paket ini juga menukar kode, menyegarkan token, memeriksa dan mencabut sesi, serta menjalankan peningkatan autentikasi.

> [!NOTE]
>
> Verifikasi token melakukan pemeriksaan yang dijelaskan dalam [Verifikasi token di server Anda](https://docs.didit.me/id/authentication/tokens-and-jwks.md#verifikasi-token-di-server-anda), terhadap penerbit dan kunci penandatanganan aplikasi Anda.

```go theme={null}
package main

import (
	"context"
	"errors"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
	"github.com/didit-protocol/sdk-go/authentication"
)

func main() {
	// The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
	auth, err := authentication.NewFromPublishableKey("pk_live_...", authentication.WithClientID("your-application-id"))
	if err != nil {
		log.Fatal(err)
	}

	claims, err := auth.VerifyAccessToken(context.Background(), "the bearer token")
	var invalid *didit.TokenVerificationError
	if errors.As(err, &invalid) {
		fmt.Println("rejected:", invalid.Reason)
		return
	} else if err != nil {
		log.Fatal(err)
	}
	fmt.Println(claims.Subject)
}
```

## Galat

```go theme={null}
package main

import (
	"context"
	"errors"
	"fmt"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	_, err := client.Sessions.RetrieveDecision(context.Background(), "11111111-2222-3333-4444-555555555555",
		didit.SessionsRetrieveDecisionParams{})
	var notFound *didit.NotFoundError
	var status *didit.APIStatusError
	switch {
	case errors.As(err, &notFound):
		fmt.Println("no such session")
	case errors.As(err, &status):
		fmt.Println(status.StatusCode, status.RequestID, status.Body)
	case err != nil:
		fmt.Println("no response:", err)
	}
}
```

## Daftar dan berkas

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	ctx := context.Background()
	client := didit.NewClient()

	// Lists page through every result.
	iter := client.Sessions.ListAutoPaging(ctx, didit.SessionsListParams{Status: didit.String("Approved")})
	for iter.Next() {
		fmt.Println(iter.Current().SessionID)
	}
	if err := iter.Err(); err != nil {
		log.Fatal(err)
	}

	// Uploads take didit.FileFromPath, FileFromBytes or FileFromReader.
	result, err := client.IDVerification.Verify(ctx, didit.IDVerificationVerifyParams{
		FrontImage: didit.FileFromPath("id-front.jpg"),
		BackImage:  didit.Some(didit.FileFromPath("id-back.jpg")),
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(result.IDVerification.Status)
}
```

## Endpoint yang belum ada di Go SDK

Go 1.0.1 dibuat sebelum endpoint berikut ditambahkan ke API, jadi tidak ada metode untuk endpoint tersebut dan halaman endpoint-nya tidak memiliki contoh Go:

* [Validasi alamat](https://docs.didit.me/id/standalone-apis/address-validation.md)
* [Hapus transaksi secara batch](https://docs.didit.me/id/management-api/transactions/delete.md)
* Jaringan Travel Rule: [ambil jaringan](https://docs.didit.me/id/management-api/travel-rule/get-networks.md), [minta akses ke jaringan](https://docs.didit.me/id/management-api/travel-rule/request-network.md), serta [ambil](https://docs.didit.me/id/management-api/travel-rule/get-network-questionnaire.md), [simpan](https://docs.didit.me/id/management-api/travel-rule/update-network-questionnaire.md) atau [kirim](https://docs.didit.me/id/management-api/travel-rule/submit-network-questionnaire.md) kuesioner jaringan
* Bukti dompet Travel Rule: [daftar bukti dompet berupa tangkapan layar](https://docs.didit.me/id/management-api/travel-rule/list-wallet-proofs.md) dan [setujui atau tolak salah satunya](https://docs.didit.me/id/management-api/travel-rule/decide-wallet-proof.md)
* Google Wallet, yang belum ada di rilis 1.0.1 mana pun: [mulai verifikasi Google Wallet](https://docs.didit.me/id/api-reference/digital-id-wallets/google-wallet.md) dan [kirim respons dompet](https://docs.didit.me/id/standalone-apis/digital-id-wallet-response.md)

SDK ini juga tidak dapat mengirim kolom permintaan yang lebih baru berikut:

* `biometric_consent`, `tags` dan `user_state` saat [membuat sesi](https://docs.didit.me/id/sessions-api/create-session.md)
* `biometric_consent_mode` saat [memperbarui konfigurasi webhook](https://docs.didit.me/id/management-api/webhook/update-config.md)
* `beneficiary_vasp` saat [memperbarui transfer Travel Rule](https://docs.didit.me/id/management-api/travel-rule/update-transfer.md)
* `confirm_delete`, yang dibutuhkan saat [menghapus laporan yang telah difinalisasi](https://docs.didit.me/id/management-api/regulatory-reports/delete.md)
* 16 kolom Validasi Database yang lebih baru yang belum ada di rilis 1.0.1 mana pun

Sampai rilis Go yang lebih baru menambahkannya, panggil endpoint-endpoint ini melalui HTTP seperti yang ditunjukkan permintaan cURL pada setiap halaman. Setiap halaman endpoint server lain di [referensi API](https://docs.didit.me/id/api-reference/overview.md) memiliki contoh Go untuk operasinya.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.