Langsung ke dokumentasi

Navigasi utama

API v1 · Panduan integrasi

Melostore H2H · API v1

Dokumentasi H2H API

Mulai integrasi, pilih produk, dan ikuti hasil setiap pesanan.

Base URL https://api.melostore.id/api/v1/h2h

Mulai integrasi

Base URL: https://api.melostore.id/api/v1/h2h. Semua contoh menggunakan data fiktif; SKU contoh harus diganti dari katalog akun Anda. Tidak ada endpoint pengenalan atau autentikasi terpisah: gunakan GET /profile untuk memeriksa akses.

Di menu API Credentials dashboard, klik Rotate Keys untuk membuat API Key, Secret Key, dan Webhook Secret. Ketiganya ditampilkan sekali pada modal hasil generate; simpan sebelum menutup modal. Rotate Keys berikutnya langsung mengganti ketiganya, sehingga kredensial API dan secret pada server penerima webhook perlu diperbarui.

Import salah satu koleksi di bawah, pilih environment, isi api_key dan secret_key dari hasil generate, lalu ambil SKU aktif dari katalog reguler atau Smart. Pertahankan buyer_trx_id/buyer_bulk_id saat mengulang request yang belum mendapat respons. Simpan ID hasil create untuk cek status.

Contoh create reguler, Smart, dan bulk memakai sandbox_mode=true. Sandbox mensimulasikan proses/history/callback tanpa debit atau invoice finansial/email. Order dashboard selalu live. Pemeriksaan akun mengikuti mode akun dan billingnya sendiri; sandbox_mode pada create bukan pengaturan untuk pemeriksaan akun.

Autentikasi, IP, dan rate limit

Kirim Accept: application/json agar galat validasi dikembalikan sebagai JSON; invoice berhasil tetap memakai Content-Type application/pdf. Kirim X-API-Key dan X-Secret-Key bersama pada endpoint terautentikasi. Kredensial berasal dari dashboard; jangan menaruhnya di browser publik. GET /check-nickname/games dan GET /check-nickname/plan tidak memerlukan header ini. Akun harus aktif dan tidak ditangguhkan.

Jika Anda menggunakan whitelist IP, daftarkan IP publik server integrasi melalui dashboard sebelum mengirim pesanan live. HTTP 403 dapat menunjukkan akses akun atau IP tidak diizinkan; periksa pengaturan akun dan IP server Anda.

Batas umum mengikuti tier, terlihat pada X-RateLimit-Limit dan X-RateLimit-Remaining. Endpoint katalog reguler/Smart/kategori juga berbagi batas 20 request/menit per profil. Pemeriksaan akun memakai X-Nickname-RateLimit-Limit dan X-Nickname-RateLimit-Remaining. Jika HTTP 429 memuat Retry-After, tunggu sejumlah detik itu; kuota harian kembali pukul 00.00 UTC.

Profil

GET/api/v1/h2h/profile

Profil dan tier terautentikasi. Saldo tetap MC/IDR; USD hanya perkiraan.

Dua header: X-API-Key dan X-Secret-Key

Parameter

Tanpa parameter.

Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/profile' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:
Contoh respons

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": {
    "id": "11111111-1111-4111-8111-111111111111",
    "name": "Example Partner",
    "email": "[email protected]",
    "tier": {
      "name": "Basic",
      "code": "basic",
      "rate_limit": 30,
      "max_ips": 3
    },
    "h2h_balance": 100000,
    "is_sandbox_mode": true,
    "total_volume_30_days": 5000,
    "webhook_url": "https://partner.example.com/h2h-callback",
    "created_at": "2026-10-02T03:00:00+00:00",
    "usd_idr_rate": 17000,
    "display_usd_idr_rate": 17000,
    "display_rate_updated_at": "2026-10-02T03:00:00+00:00"
  }
}

Saldo dan kurs

GET/api/v1/h2h/profile/balance

Kurs tampilan terpisah dari kurs deposit. Perkiraan USD null saat kurs belum tersedia.

Dua header: X-API-Key dan X-Secret-Key

Parameter

Tanpa parameter.

Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/profile/balance' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:
Contoh respons

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": {
    "h2h_balance": 100000,
    "is_sandbox_mode": true,
    "usd_idr_rate": 17000,
    "display_usd_idr_rate": 17000,
    "display_rate_updated_at": "2026-10-02T03:00:00+00:00",
    "h2h_balance_usd": 5.88
  }
}

Ambil harga per brand

1. Ambil GET /pricelists/categories untuk brand reguler, atau GET /smart-pricelists/categories untuk brand Smart. Setiap record adalah brand, dilengkapi category sebagai objek kategori induk dan type sebagai daftar tipe anak. Urutan berdasarkan ID kategori induk naik, lalu nama brand A–Z.

2. Pilih brand dari data[]. Gunakan brand_id sebagai filter: GET /pricelists?brand_id=10&limit=500 atau GET /smart-pricelists?brand_id=10&limit=500. Ganti 10 dengan brand_id dari respons Anda. Field brand_id menggantikan id pada daftar brand; sesuaikan pembacaan field pada integrasi Anda.

3. Alternatif tanpa ID: gunakan slug brand pada /pricelists/{category_slug} atau /smart-pricelists/{category_slug}. Gunakan slug persis dari daftar brand katalog yang sama, jangan menebaknya dari nama game.

meta.brands hanya memuat brand pada halaman harga yang sedang dibaca. Untuk daftar lengkap, gunakan endpoint daftar brand. Brand yang terdaftar dapat memiliki produk out_of_stock; pesan hanya produk active.

category bernilai null jika brand tidak memiliki kategori induk; brand tersebut tampil di akhir. type berisi semua tipe anak langsung, diurutkan menurut nama A–Z, atau [] jika tidak ada. Adanya tipe tidak menjamin produk tersedia pada katalog yang dipilih.

Kenali SKU, server, dan form

sku_code adalah kode produk reguler untuk /transaction dan bulk. smart_sku_code adalah kode produk Smart; kirim nilainya pada field sku_code ke /smart-transaction. Keduanya berasal dari katalog, bukan dari kode game pemeriksaan akun.

brand_id dan slug berasal dari daftar brand. server_code menunjukkan kelompok produk pada katalog; customer_target_zone adalah zone/server akun pembeli sesuai form produk. Nilainya tidak harus sama.

Pada katalog reguler, server boleh tidak dikirim atau kosong untuk mengambil semua server. format boleh tidak dikirim atau kosong untuk memakai compact; pilih legacy jika memerlukan inquiry_fields langsung pada setiap produk tanpa pagination.

Cari inquiry_form_key produk di meta.inquiry_forms pada halaman yang sama. Isi customer_target dari field pertama, customer_target_zone dari field kedua bila ada, dan additional_data untuk field berikutnya memakai key form. Untuk pilihan, kirim value yang tersedia, bukan label. Baca notice.id atau notice.en jika ada petunjuk tambahan.

game_code khusus pemeriksaan akun dan berasal dari games[].game_code pada GET /check-nickname/games. Pemeriksaan akun tidak menjamin semua SKU dengan nama game serupa mempunyai zone atau ketentuan yang sama.

Pagination dan data pelanggan

Ambil katalog dengan limit=500. Gunakan meta.pagination.next_cursor sebagai cursor pada request berikutnya dan lanjutkan sampai meta.pagination.has_more=false. Nilai limit yang tersedia adalah 1–1000; gunakan maksimal 500 per halaman. Panduan ini berlaku untuk katalog reguler dan Smart.

Ikuti form produk yang dipilih untuk mengisi data pelanggan. Pada format compact, gunakan inquiry_form_key untuk menemukan form di meta.inquiry_forms. Isi customer_target dari field pertama, customer_target_zone dari field kedua jika diperlukan, dan additional_data untuk field lainnya sesuai key pada form. Pada format legacy reguler, form tersedia langsung di inquiry_fields.

Satu request reguler atau Smart membuat satu pesanan. Untuk memesan SKU reguler berulang kali ke target yang sama, gunakan bulk dengan order_count (1–100). Pesanan bulk diproses satu per satu sesuai urutan.

Katalog reguler

GET/api/v1/h2h/pricelists

Harga sesuai tier akun Anda. Pilih sku_code aktif untuk POST /transaction. Gunakan bulk dengan order_count untuk pesanan berulang. Untuk satu brand, gunakan brand_id dari daftar brand katalog ini atau slug brand pada path. Ikuti next_cursor sampai has_more=false.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
limitinteger · queryOpsionalJumlah produk per halaman, 1–1000. Gunakan 500 untuk sinkronisasi. Tanpa limit, respons reguler berisi seluruh hasil; kirim limit untuk pagination. min=1 max=1000
cursorstring · queryOpsionalSalin meta.pagination.next_cursor dari halaman sebelumnya. Pertahankan filter yang sama selama pagination.
serverstring · queryOpsionalserver_code produk dari katalog, bukan zone akun pelanggan. Tidak dikirim atau kosong berarti semua server katalog.
formatcompact | legacy · queryOpsionalTidak dikirim atau kosong memakai compact. legacy menyertakan inquiry_fields langsung dan mengembalikan semua hasil tanpa pagination cursor.
brand_idinteger · queryOpsionalFilter memakai data[].brand_id dari daftar brand katalog yang sama. Kosongkan untuk mengambil semua brand. min=1
Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/pricelists?limit=500' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:
Contoh respons

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": [
    {
      "name": "Example product",
      "sku_code": "EXAMPLE-10",
      "price": 1000,
      "category_name": "Example category",
      "brand_id": 10,
      "type_name": "Example type",
      "category_order": 1,
      "type_order": 1,
      "server_code": "global",
      "server_name": "Global",
      "status": "active",
      "inquiry_form_key": "example-form",
      "h2h_description": null,
      "description": null,
      "id": 1
    }
  ],
  "meta": {
    "brands": [
      {
        "id": 10,
        "name": "Example brand",
        "thumbnail": null,
        "order": 1
      }
    ],
    "inquiry_forms": {
      "example-form": {
        "fields": [
          {
            "key": "customer_target",
            "name": "Player ID",
            "type": "text"
          },
          {
            "key": "customer_target_zone",
            "name": "Zone",
            "type": "text"
          }
        ],
        "notice": {
          "id": "Masukkan ID dan zone sesuai akun pembeli.",
          "en": "Enter the ID and zone from the buyer account."
        }
      }
    },
    "pagination": {
      "cursor": null,
      "next_cursor": null,
      "limit": 100,
      "total": 1,
      "has_more": false
    }
  }
}

Harga reguler per brand

GET/api/v1/h2h/pricelists/{category_slug}

Harga sesuai tier akun Anda. Pilih sku_code aktif untuk POST /transaction. Gunakan bulk dengan order_count untuk pesanan berulang. Untuk satu brand, gunakan brand_id dari daftar brand katalog ini atau slug brand pada path. Ikuti next_cursor sampai has_more=false.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
category_slugstring · pathWajibSlug brand dari data[].slug pada daftar brand katalog yang sama. Slug kategori/tipe lama tetap didukung.
limitinteger · queryOpsionalJumlah produk per halaman, 1–1000. Gunakan 500 untuk sinkronisasi. Tanpa limit, respons reguler berisi seluruh hasil; kirim limit untuk pagination. min=1 max=1000
cursorstring · queryOpsionalSalin meta.pagination.next_cursor dari halaman sebelumnya. Pertahankan filter yang sama selama pagination.
serverstring · queryOpsionalserver_code produk dari katalog, bukan zone akun pelanggan. Tidak dikirim atau kosong berarti semua server katalog.
formatcompact | legacy · queryOpsionalTidak dikirim atau kosong memakai compact. legacy menyertakan inquiry_fields langsung dan mengembalikan semua hasil tanpa pagination cursor.
brand_idinteger · queryOpsionalFilter memakai data[].brand_id dari daftar brand katalog yang sama. Kosongkan untuk mengambil semua brand. min=1
Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/pricelists/example-brand?limit=500' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:
Contoh respons

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": [
    {
      "name": "Example product",
      "sku_code": "EXAMPLE-10",
      "price": 1000,
      "category_name": "Example category",
      "brand_id": 10,
      "type_name": "Example type",
      "category_order": 1,
      "type_order": 1,
      "server_code": "global",
      "server_name": "Global",
      "status": "active",
      "inquiry_form_key": "example-form",
      "h2h_description": null,
      "description": null,
      "id": 1
    }
  ],
  "meta": {
    "brands": [
      {
        "id": 10,
        "name": "Example brand",
        "thumbnail": null,
        "order": 1
      }
    ],
    "inquiry_forms": {
      "example-form": {
        "fields": [
          {
            "key": "customer_target",
            "name": "Player ID",
            "type": "text"
          },
          {
            "key": "customer_target_zone",
            "name": "Zone",
            "type": "text"
          }
        ],
        "notice": null
      }
    },
    "pagination": {
      "cursor": null,
      "next_cursor": null,
      "limit": 100,
      "total": 1,
      "has_more": false
    }
  },
  "category": {
    "name": "Example brand",
    "slug": "example-brand"
  }
}

Katalog Smart

GET/api/v1/h2h/smart-pricelists

Harga sesuai tier akun Anda. Pilih smart_sku_code aktif untuk POST /smart-transaction. Untuk satu brand, gunakan brand_id dari daftar brand katalog ini atau slug brand pada path. Ikuti next_cursor sampai has_more=false.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
limitinteger · queryOpsionalJumlah produk per halaman, 1–1000. Gunakan 500 untuk sinkronisasi. Default 500. min=1 max=1000
cursorstring · queryOpsionalSalin meta.pagination.next_cursor dari halaman sebelumnya. Pertahankan filter yang sama selama pagination.
brandKompatibilitasinteger / string · queryOpsionalAlias kompatibilitas: ID atau nama brand persis. Gunakan brand_id untuk integrasi baru.
categoryKompatibilitasinteger / string · queryOpsionalFilter kompatibilitas kategori utama berdasarkan ID atau nama persis. Gunakan brand_id atau slug brand.
searchstring · queryOpsionalCari nama produk atau Smart SKU.
brand_idinteger · queryOpsionalFilter memakai data[].brand_id dari daftar brand katalog yang sama. Kosongkan untuk mengambil semua brand. min=1
Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/smart-pricelists?limit=500' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": [
    {
      "name": "Example product",
      "category_name": "Example category",
      "brand_id": 10,
      "type_name": "Example type",
      "category_order": 1,
      "type_order": 1,
      "status": "active",
      "inquiry_form_key": "example-form",
      "h2h_description": null,
      "description": null,
      "smart_sku_code": "smartEXAMPLE",
      "min_price": 1000,
      "max_price": 1000,
      "variant_count": 1,
      "variants": [
        {
          "sku_code": "EXAMPLE-10",
          "price": 1000,
          "status": "active"
        }
      ]
    }
  ],
  "meta": {
    "brands": [
      {
        "id": 10,
        "name": "Example brand",
        "thumbnail": null,
        "order": 1
      }
    ],
    "inquiry_forms": {
      "example-form": {
        "fields": [
          {
            "key": "customer_target",
            "name": "Player ID",
            "type": "text"
          },
          {
            "key": "customer_target_zone",
            "name": "Zone",
            "type": "text"
          }
        ],
        "notice": null
      }
    },
    "pagination": {
      "cursor": null,
      "next_cursor": null,
      "limit": 100,
      "has_more": false
    }
  }
}

Harga Smart per brand

GET/api/v1/h2h/smart-pricelists/{category_slug}

Harga sesuai tier akun Anda. Pilih smart_sku_code aktif untuk POST /smart-transaction. Untuk satu brand, gunakan brand_id dari daftar brand katalog ini atau slug brand pada path. Ikuti next_cursor sampai has_more=false.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
category_slugstring · pathWajibSlug brand dari data[].slug pada daftar brand katalog yang sama. Slug kategori/tipe lama tetap didukung.
limitinteger · queryOpsionalJumlah produk per halaman, 1–1000. Gunakan 500 untuk sinkronisasi. Default 500. min=1 max=1000
cursorstring · queryOpsionalSalin meta.pagination.next_cursor dari halaman sebelumnya. Pertahankan filter yang sama selama pagination.
brandKompatibilitasinteger / string · queryOpsionalAlias kompatibilitas: ID atau nama brand persis. Gunakan brand_id untuk integrasi baru.
categoryKompatibilitasinteger / string · queryOpsionalFilter kompatibilitas kategori utama berdasarkan ID atau nama persis. Gunakan brand_id atau slug brand.
searchstring · queryOpsionalCari nama produk atau Smart SKU.
brand_idinteger · queryOpsionalFilter memakai data[].brand_id dari daftar brand katalog yang sama. Kosongkan untuk mengambil semua brand. min=1
Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/smart-pricelists/example-brand?limit=500' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": [
    {
      "name": "Example product",
      "category_name": "Example category",
      "brand_id": 10,
      "type_name": "Example type",
      "category_order": 1,
      "type_order": 1,
      "status": "active",
      "inquiry_form_key": "example-form",
      "h2h_description": null,
      "description": null,
      "smart_sku_code": "smartEXAMPLE",
      "min_price": 1000,
      "max_price": 1000,
      "variant_count": 1,
      "variants": [
        {
          "sku_code": "EXAMPLE-10",
          "price": 1000,
          "status": "active"
        }
      ]
    }
  ],
  "meta": {
    "brands": [
      {
        "id": 10,
        "name": "Example brand",
        "thumbnail": null,
        "order": 1
      }
    ],
    "inquiry_forms": {
      "example-form": {
        "fields": [
          {
            "key": "customer_target",
            "name": "Player ID",
            "type": "text"
          },
          {
            "key": "customer_target_zone",
            "name": "Zone",
            "type": "text"
          }
        ],
        "notice": null
      }
    },
    "pagination": {
      "cursor": null,
      "next_cursor": null,
      "limit": 100,
      "has_more": false
    }
  }
}

Daftar brand reguler

GET/api/v1/h2h/pricelists/categories

Brand yang memiliki produk pada katalog reguler tier Anda. Setiap record berisi brand_id, name, slug, kategori induk pada category, serta tipe produk anak langsung pada type[]. Urutan berdasarkan ID kategori induk naik, lalu nama brand A-Z; brand tanpa kategori induk di akhir. Gunakan brand_id sebagai filter katalog atau slug pada /pricelists/{category_slug}. Brand atau tipe yang terdaftar tidak menjamin SKU aktif; periksa daftar harga terkait.

Dua header: X-API-Key dan X-Secret-Key

Parameter

Tanpa parameter.

Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/pricelists/categories' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:
Contoh respons

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": [
    {
      "brand_id": 10,
      "name": "Example brand",
      "slug": "example-brand",
      "category": {
        "id": 1,
        "name": "Games",
        "slug": "games"
      },
      "type": [
        {
          "id": 11,
          "name": "Diamonds",
          "slug": "example-diamonds"
        },
        {
          "id": 12,
          "name": "Passes",
          "slug": "example-passes"
        }
      ]
    }
  ]
}

Daftar brand Smart

GET/api/v1/h2h/smart-pricelists/categories

Brand yang memiliki produk pada katalog Smart tier Anda. Setiap record berisi brand_id, name, slug, kategori induk pada category, serta tipe produk anak langsung pada type[]. Urutan berdasarkan ID kategori induk naik, lalu nama brand A-Z; brand tanpa kategori induk di akhir. Gunakan brand_id sebagai filter katalog atau slug pada /smart-pricelists/{category_slug}. Brand atau tipe yang terdaftar tidak menjamin SKU aktif; periksa daftar harga terkait.

Dua header: X-API-Key dan X-Secret-Key

Parameter

Tanpa parameter.

Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/smart-pricelists/categories' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:
Contoh respons

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": [
    {
      "brand_id": 10,
      "name": "Example brand",
      "slug": "example-brand",
      "category": {
        "id": 1,
        "name": "Games",
        "slug": "games"
      },
      "type": [
        {
          "id": 11,
          "name": "Diamonds",
          "slug": "example-diamonds"
        },
        {
          "id": 12,
          "name": "Passes",
          "slug": "example-passes"
        }
      ]
    }
  ]
}

Jika request gagal atau terputus

Timeout, HTTP 500, atau koneksi terputus: simpan buyer_trx_id dan cek status dengan referensi itu. Jika perlu, ulangi request yang sama dengan referensi yang sama. Jangan langsung membuat referensi baru karena pesanan pertama mungkin sudah diterima.

HTTP 401: periksa dua header kredensial. HTTP 403: periksa akses akun dan whitelist IP yang berlaku. HTTP 422: periksa errors dan parameter; MAX_PRICE_TOO_LOW meminta batas minimal sesuai harga katalog. HTTP 429: tunggu Retry-After sebelum retry.

HTTP 201 hanya berarti pesanan diterima. pending/processing masih berjalan; success berhasil; failed gagal dan saldo yang dipotong dikembalikan. Buat pesanan pengganti hanya setelah hasil sebelumnya final.

PROVIDER_PRICE_CHANGED: setelah hasil failed, ambil harga terbaru sebelum membuat pesanan baru. HTTP 409 pada bulk dapat berarti referensi dipakai dengan isi berbeda atau invoice belum tersedia; baca message sesuai endpoint.

Tindakan pelanggan dan verifikasi 2FA

Tindakan pelanggan terpisah dari status transaksi. Pesanan reguler dan Smart tetap processing selama verifikasi berjalan: required → submitted → resolved. need_action=true hanya pada required; tampilkan form hanya bila action.can_submit=true.

Saat required, minta pembeli mengirim kode melalui POST /api/v1/h2h/transactions/2fa dengan buyer_trx_id dan code. Sertakan action_id serta action_version terbaru untuk mencegah pengiriman ke permintaan lama. Kode berupa string 1–128 karakter setelah trim, tanpa karakter kontrol; tidak terbatas enam digit.

HTTP 202 berarti kode diterima untuk penanganan admin, bukan kode sudah terbukti valid. Setelah submitted, sembunyikan form dan tampilkan menunggu admin. resolved menyembunyikan flag. Admin dapat meminta ulang: state kembali required dengan versi lebih besar. Ambil kode terbaru dari pembeli saat itu.

Gunakan autentikasi serta IP whitelist yang sama. Batas 5 permintaan/menit per pemilik dan transaksi. Retry kode yang sama mengembalikan hasil sebelumnya tanpa pemberitahuan baru; kode berbeda mendapat 409. Versi lama, transaksi final, atau tindakan tidak tersedia mendapat 409. Referensi milik akun lain mendapat 404.

Webhook transaction.action_change dapat diterima sebelum hasil akhir. Verifikasi X-H2H-Signature terhadap raw body menggunakan Webhook Secret. Deduplicasi dengan event_id dan versi; abaikan action.version yang lebih lama. Simpan tindakan secara terpisah: event tindakan tidak boleh menyelesaikan pesanan, mengubah saldo, atau memicu refund. Webhook hasil akhir juga menyertakan snapshot tindakan terbaru.

Status, refund, dan referensi

HTTP 201/200 berarti request diterima atau status berhasil dibaca. Periksa data.status untuk hasil pesanan: pending/processing masih diproses, success berhasil, dan failed gagal. Saldo yang terpotong untuk pesanan gagal dikembalikan. serial_number dapat kosong sampai hasil tersedia; detail pemeriksaan akun dapat memakai null. Gunakan error_code/message untuk membaca alasan kegagalan.

Regular order menerima max_price opsional berupa integer positif dalam MC/IDR. Nilainya harus mencakup harga tier saat ini; jika lebih kecil, request ditolak HTTP 422 dengan MAX_PRICE_TOO_LOW sebelum saldo dipotong. Nilai yang sama diperbolehkan. Tanpa parameter atau null memakai aturan otomatis.

Jika max_price dikirim, saldo harus cukup untuk seluruh batas tersebut. Biaya akhir pesanan sukses tidak melebihi max_price. Selisih saldo yang ditahan dikembalikan saat sukses; seluruh nilai dikembalikan saat gagal.

Contoh: max_price 1.100 MC membuat saldo ditahan 1.100 MC. Jika biaya akhir 1.000 MC, selisih 100 MC dikembalikan. Angka ini hanya ilustrasi; tentukan batas memakai harga katalog akun Anda.

PROVIDER_PRICE_CHANGED berarti harga berubah sehingga pesanan tidak dapat diselesaikan. Setelah status pesanan sebelumnya failed, ambil harga terbaru dan gunakan buyer_trx_id baru jika ingin memesan lagi. Mengulang referensi pesanan gagal tetap mengembalikan hasil sebelumnya.

Reguler dan Smart mewajibkan buyer_trx_id sebagai referensi unik pesanan Anda. Jika request terputus, cek GET /transaction/{id} menggunakan buyer_trx_id atau ulangi request yang sama dengan referensi tersebut. Referensi yang sudah dipakai mengembalikan transaksi sebelumnya. Gunakan referensi baru untuk pesanan baru. Smart menahan saldo sebesar max_bid dan mengembalikan selisih setelah harga akhir diketahui.

Simpan SKU yang Anda pesan bersama id dan buyer_trx_id. Cocokkan respons status dan callback melalui id/buyer_trx_id karena sku_code pada hasil Smart dapat berbeda dari SKU saat pemesanan. fulfilled_sku_code menunjukkan SKU yang berhasil dipenuhi. Pada detail pemeriksaan akun berbayar, buyer_trx_id dan sku_code bernilai null.

Selama status masih pending/processing, tunggu hasil akhir melalui callback atau cek status; jangan membuat pesanan pengganti untuk request yang sama. Harga pada respons transaksi memakai price, sedangkan callback memakai price_charged. Harga awal Smart dapat menunjukkan max_bid, dan regular dengan max_price menunjukkan nilai hold sebelum harga akhir tersedia. price_charged pada pesanan gagal tidak menunjukkan biaya akhir setelah refund; periksa saldo dan invoice untuk rekonsiliasi.

Buat transaksi reguler

POST/api/v1/h2h/transaction

Buat satu pesanan memakai sku_code reguler. HTTP 201 berarti pesanan diterima; baca data.status untuk hasilnya. Jika respons belum pasti, ulangi request yang sama dengan buyer_trx_id yang sama. Gunakan referensi baru untuk pesanan baru. max_price opsional membatasi biaya akhir dan seluruh batas ditahan di awal. Sisa saldo dikembalikan saat sukses; pesanan gagal mendapat refund penuh.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
sku_codestring · bodyWajibsku_code persis dari katalog reguler.
customer_targetstring · bodyWajibID pelanggan, nomor telepon, atau email sesuai field pertama pada form katalog. Kirim sebagai string. maxLength=255
customer_target_zonestring | null · bodyOpsionalWajib jika form produk/game memerlukan field zone kedua. Gunakan nilai opsi, bukan label tampilannya. maxLength=100
additional_dataobject | null · bodyOpsionalNilai field form lainnya, memakai key dari meta.inquiry_forms. Kosongkan jika tidak diperlukan.
buyer_trx_idstring · bodyWajibReferensi unik pesanan Anda. Pertahankan saat retry pesanan yang sama; gunakan referensi baru untuk pesanan baru. maxLength=64
sandbox_modeboolean | null · bodyOpsionaltrue untuk simulasi tanpa debit saldo; false untuk pesanan live. Kosongkan/null mengikuti mode akun.
max_priceinteger | null · bodyOpsionalBatas biaya akhir opsional dalam MC/IDR, minimal harga tier saat ini. Saldo harus cukup untuk seluruh batas yang ditahan di awal. Sisa dikembalikan saat sukses; gagal mendapat refund penuh. Kosongkan/null untuk harga otomatis. min=1 max=99999999999
Contoh request
Contoh request
curl -X POST 'https://api.melostore.id/api/v1/h2h/transaction' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY" \
  -H 'Content-Type: application/json' \
  --data '{
  "sku_code": "EXAMPLE-10",
  "customer_target": "123456789",
  "customer_target_zone": "1234",
  "buyer_trx_id": "example-order-001",
  "sandbox_mode": true,
  "additional_data": {
    "email": "[email protected]"
  }
}'
Respons HTTP:
Contoh respons

Request diterima. Baca data.status untuk hasil pesanan.

HTTP 201 · Respons HTTP
{
  "success": true,
  "message": "Transaction successfully created and queued.",
  "data": {
    "id": "11111111-1111-4111-8111-111111111111",
    "buyer_trx_id": "example-order-001",
    "sku_code": "EXAMPLE-10",
    "product_name": "Example product",
    "customer_target": "123456789",
    "customer_target_zone": "1234",
    "price": 1000,
    "status": "processing",
    "serial_number": "",
    "webhook_delivery_status": "pending",
    "is_sandbox": true,
    "created_at": "2026-10-02T03:00:00+00:00"
  }
}

Buat Smart Order

POST/api/v1/h2h/smart-transaction

Buat satu pesanan Smart dengan smart_sku_code sebagai sku_code dan max_bid sebagai anggaran. Seluruh anggaran ditahan di awal. Biaya akhir pesanan sukses tidak melebihi max_bid; sisa saldo dikembalikan. Pesanan gagal mendapat refund penuh. Untuk PROVIDER_PRICE_CHANGED, perbarui katalog dan buat pesanan baru setelah pesanan sebelumnya final.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
sku_codestring · bodyWajibIsi dengan nilai smart_sku_code dari katalog Smart. maxLength=100
customer_targetstring · bodyWajibID pelanggan, nomor telepon, atau email sesuai field pertama pada form katalog. Kirim sebagai string. maxLength=255
customer_target_zonestring | null · bodyOpsionalWajib jika form produk/game memerlukan field zone kedua. Gunakan nilai opsi, bukan label tampilannya. maxLength=100
additional_dataobject | null · bodyOpsionalNilai field form lainnya, memakai key dari meta.inquiry_forms. Kosongkan jika tidak diperlukan.
buyer_trx_idstring · bodyWajibReferensi unik pesanan Anda. Pertahankan saat retry pesanan yang sama; gunakan referensi baru untuk pesanan baru. maxLength=64
sandbox_modeboolean | null · bodyOpsionaltrue untuk simulasi tanpa debit saldo; false untuk pesanan live. Kosongkan/null mengikuti mode akun.
max_bidinteger · bodyWajibAnggaran maksimal Smart Order dalam MC/IDR. Seluruh nilai ditahan di awal; sisanya dikembalikan. min=1
Contoh request
curl -X POST 'https://api.melostore.id/api/v1/h2h/smart-transaction' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY" \
  -H 'Content-Type: application/json' \
  --data '{
  "sku_code": "smartEXAMPLE",
  "customer_target": "123456789",
  "customer_target_zone": "1234",
  "buyer_trx_id": "example-smart-order-001",
  "sandbox_mode": true,
  "additional_data": {
    "email": "[email protected]"
  },
  "max_bid": 1100
}'
Respons HTTP:

Request berhasil.

HTTP 201 · Respons HTTP
{
  "success": true,
  "message": "Transaction successfully created and queued.",
  "data": {
    "id": "11111111-1111-4111-8111-111111111111",
    "buyer_trx_id": "example-smart-order-001",
    "sku_code": "smartEXAMPLE",
    "product_name": "Example product",
    "customer_target": "123456789",
    "customer_target_zone": "1234",
    "price": 1100,
    "status": "processing",
    "serial_number": "",
    "webhook_delivery_status": "pending",
    "is_sandbox": true,
    "created_at": "2026-10-02T03:00:00+00:00",
    "max_bid": 1100
  }
}

Status transaksi

GET/api/v1/h2h/transaction/{id}

Cari transaksi Anda melalui UUID atau buyer_trx_id. Berlaku untuk reguler, Smart, dan setiap pesanan bulk; gunakan billing.transaction_id untuk pemeriksaan akun berbayar. Cocokkan hasil Smart melalui id/buyer_trx_id karena sku_code dapat berbeda dari SKU yang dipesan. fulfilled_sku_code menunjukkan SKU yang berhasil dipenuhi. buyer_trx_id, sku_code, dan serial_number pemeriksaan akun bernilai null. Field Smart/bulk hanya muncul sesuai jenis pesanan.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
idstring · pathWajibID milik akun Anda dari hasil create; status transaksi juga menerima buyer_trx_id.
Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/transaction/11111111-1111-4111-8111-111111111111' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:
Contoh respons

Detail pesanan. Baca data.status untuk hasil saat ini.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": {
    "id": "11111111-1111-4111-8111-111111111111",
    "buyer_trx_id": "example-order-001",
    "sku_code": "EXAMPLE-10",
    "product_name": "Example product",
    "customer_target": "123456789",
    "customer_target_zone": "1234",
    "price": 1000,
    "status": "processing",
    "serial_number": "",
    "webhook_delivery_status": "pending",
    "is_sandbox": true,
    "created_at": "2026-10-02T03:00:00+00:00"
  }
}

Kirim kode verifikasi 2FA

POST/api/v1/h2h/transactions/2fa

Kirim kode yang diminta untuk penanganan admin pada transaksi reguler atau Smart. Gunakan X-API-Key, X-Secret-Key, dan IP whitelist yang berlaku. Batas 5 permintaan/menit per pemilik dan transaksi. HTTP 202 berarti diterima, bukan terbukti valid. Ulangi kode yang sama jika respons belum diterima; kode berbeda ditolak sampai permintaan baru. Status transaksi dan keuangan tidak berubah.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
buyer_trx_idstring · bodyWajibbuyer_trx_id pesanan yang sedang meminta kode ini. Gunakan referensi pesanan yang sama. maxLength=255
codestring · bodyWajibKode verifikasi terbaru dari pembeli, 1–128 karakter setelah trim, tanpa karakter kontrol. maxLength=128
action_idstring · bodyOpsionalaction.id terbaru dari status pesanan ini atau webhook tindakan. Disarankan agar kode tidak terkirim ke permintaan lama.
action_versioninteger · bodyOpsionalaction.version terbaru dari pesanan yang sama. Kirim sebagai integer JSON. min=1
Contoh request
curl -X POST 'https://api.melostore.id/api/v1/h2h/transactions/2fa' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY" \
  -H 'Content-Type: application/json' \
  --data '{
  "buyer_trx_id": "example-order-001",
  "code": "fictional-alpha-91",
  "action_id": "11111111-1111-4111-8111-111111111111",
  "action_version": 1
}'
Respons HTTP:

Kode diterima untuk penanganan admin.

HTTP 202 · Respons HTTP
{
  "success": true,
  "message": "Your verification code has been received and is awaiting admin handling.",
  "data": {
    "need_action": false,
    "action": {
      "id": "11111111-1111-4111-8111-111111111111",
      "type": "two_factor",
      "state": "submitted",
      "version": 2,
      "message": "Your verification code has been received and is awaiting admin handling.",
      "can_submit": false,
      "updated_at": "2026-10-10T08:02:00+07:00"
    }
  }
}

Panduan bulk order

Satu bulk berisi satu SKU reguler, satu target, dan 1–100 pesanan. Harga dikunci saat pesanan diterima. Setiap pesanan memiliki referensi dan hasil sendiri. Total biaya seluruh pesanan dipotong di awal. Pastikan saldo cukup untuk seluruh bulk; jika saldo kurang, bulk tidak dibuat.

Gunakan order_count untuk jumlah pesanan bulk. Jangan kirim quantity, max_bid, atau order_mode pada request bulk; nilai terisi pada parameter tersebut ditolak dengan HTTP 422.

Gunakan buyer_bulk_id unik untuk setiap bulk dan simpan sebelum mengirim request. Request pertama mengembalikan HTTP 201. Pengulangan request yang sama dengan referensi yang sama mengembalikan HTTP 200 tanpa pemotongan saldo tambahan. Jika isi request berbeda, referensi yang sama menghasilkan HTTP 409. Gunakan referensi baru untuk bulk baru.

Pesanan dalam satu bulk diproses berurutan. Pantau hasil setiap pesanan pada detail bulk; biaya pesanan yang gagal dikembalikan. Jika ingin memesan ulang, gunakan referensi transaksi baru setelah hasil sebelumnya final. Bulk hanya tersedia untuk katalog reguler dengan satu SKU dan satu target; pause dan pembatalan belum tersedia.

Baca success_count dan failed_count untuk jumlah pesanan yang sudah selesai, serta remaining_count untuk yang belum selesai. processing_count menunjukkan pesanan yang sedang diproses dan queued_count menunjukkan pesanan yang menunggu. Status bulk: queued, processing, completed, partially_failed, atau failed. Gunakan GET /bulk-orders/{id} untuk ringkasan progres; callback dikirim per transaksi.

Unduh invoice PDF setelah seluruh pesanan selesai. HTTP 409 berarti invoice belum tersedia atau bulk menggunakan sandbox. Bulk live memiliki satu invoice yang merangkum biaya dan refund, termasuk refund penuh dan biaya akhir nol jika semua pesanan gagal. Invoice dikirim melalui email setelah selesai. Setiap pesanan juga dapat dilihat pada menu Transaksi. Sandbox tidak menghasilkan invoice atau email invoice.

AspekTransaksi regulerBulk order
Jumlah transaksiSatuorder_count transaksi anak
Referensi pelangganbuyer_trx_idbuyer_bulk_id + referensi unik anak
SaldoDebit satu transaksiDebit semua anak di awal
PemrosesanSatu transaksi asyncBerurutan dalam satu bulk
HistoryDetail transaksiRingkasan progres dan detail anak
Invoice/email bulkTidak berlakuSatu dokumen dan email akhir

Buat bulk order

POST/api/v1/h2h/bulk-orders

Membuat 1–100 pesanan terpisah untuk satu SKU reguler dan satu target. Total biaya dipotong di awal; saldo kurang membuat bulk tidak dapat dibuat. Gunakan buyer_bulk_id unik untuk setiap bulk dan pertahankan saat retry. Isi order_count dan jangan kirim quantity, max_bid, atau order_mode; nilai terisi pada parameter tersebut menghasilkan HTTP 422.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
sku_codestring · bodyWajibsku_code persis dari katalog reguler. maxLength=100
customer_targetstring · bodyWajibID pelanggan, nomor telepon, atau email sesuai field pertama pada form katalog. Kirim sebagai string. maxLength=255
customer_target_zonestring | null · bodyOpsionalWajib jika form produk/game memerlukan field zone kedua. Gunakan nilai opsi, bukan label tampilannya. maxLength=100
additional_dataobject | null · bodyOpsionalNilai field form lainnya, memakai key dari meta.inquiry_forms. Kosongkan jika tidak diperlukan.
sandbox_modeboolean | null · bodyOpsionaltrue untuk simulasi tanpa debit saldo; false untuk pesanan live. Kosongkan/null mengikuti mode akun.
buyer_bulk_idstring · bodyWajibReferensi unik bulk Anda. Retry identik mengembalikan bulk sebelumnya; isi berbeda menghasilkan HTTP 409. maxLength=64
order_countinteger · bodyWajibJumlah pesanan terpisah, 1–100, diproses berurutan untuk satu SKU reguler dan target. min=1 max=100
Contoh request
curl -X POST 'https://api.melostore.id/api/v1/h2h/bulk-orders' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY" \
  -H 'Content-Type: application/json' \
  --data '{
  "sku_code": "EXAMPLE-10",
  "customer_target": "123456789",
  "customer_target_zone": "1234",
  "sandbox_mode": true,
  "additional_data": {
    "email": "[email protected]"
  },
  "order_count": 3,
  "buyer_bulk_id": "example-bulk-001"
}'
Respons HTTP:
Contoh respons

Request diterima. Baca data.status untuk hasil pesanan.

HTTP 201 · Respons HTTP
{
  "success": true,
  "message": "Bulk order created and queued.",
  "data": {
    "id": "22222222-2222-4222-8222-222222222222",
    "buyer_bulk_id": "example-bulk-001",
    "sku_code": "EXAMPLE-10",
    "product_name": "Example product",
    "customer_target": "123456789",
    "customer_target_zone": "1234",
    "order_count": 3,
    "unit_price": 1000,
    "total_debit": 0,
    "status": "queued",
    "via": "api",
    "is_sandbox": true,
    "invoice_available": false,
    "created_at": "2026-10-02T03:00:00+00:00",
    "completed_at": null,
    "total_count": 3,
    "success_count": 0,
    "failed_count": 0,
    "processed_count": 0,
    "remaining_count": 3,
    "processing_count": 0,
    "queued_count": 3
  }
}

History bulk

GET/api/v1/h2h/bulk-orders

Pesanan milik profil, 15 per halaman. Filter tanggal inklusif zona Asia/Jakarta.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
pageinteger · queryOpsionalNomor halaman, mulai dari 1.
statusqueued | processing | completed | partially_failed | failed · queryOpsionalFilter status bulk sesuai nilai yang tersedia.
searchstring · queryOpsionalCari referensi, target, SKU, atau nama produk.
start_datestring · queryOpsionalTanggal awal YYYY-MM-DD, zona Asia/Jakarta.
end_datestring · queryOpsionalTanggal akhir YYYY-MM-DD, tidak sebelum tanggal awal.
Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/bulk-orders?page=1' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:
Contoh respons

Data dan progres pesanan bulk.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": {
    "current_page": 1,
    "data": [
      {
        "id": "22222222-2222-4222-8222-222222222222",
        "buyer_bulk_id": "example-bulk-001",
        "sku_code": "EXAMPLE-10",
        "product_name": "Example product",
        "customer_target": "123456789",
        "customer_target_zone": "1234",
        "order_count": 3,
        "unit_price": 1000,
        "total_debit": 0,
        "status": "processing",
        "via": "api",
        "is_sandbox": true,
        "invoice_available": false,
        "created_at": "2026-10-02T03:00:00+00:00",
        "completed_at": null,
        "total_count": 3,
        "success_count": 1,
        "failed_count": 1,
        "processed_count": 2,
        "remaining_count": 1,
        "processing_count": 1,
        "queued_count": 0
      }
    ],
    "first_page_url": "https://api.melostore.id/api/v1/h2h/bulk-orders?page=1",
    "from": 1,
    "last_page": 1,
    "last_page_url": "https://api.melostore.id/api/v1/h2h/bulk-orders?page=1",
    "links": [
      {
        "url": null,
        "label": "Previous",
        "active": false
      }
    ],
    "next_page_url": null,
    "path": "https://api.melostore.id/api/v1/h2h/bulk-orders",
    "per_page": 15,
    "prev_page_url": null,
    "to": 1,
    "total": 1
  }
}

Progres bulk

GET/api/v1/h2h/bulk-orders/{id}

Lihat status bulk dan jumlah pesanan. processed_count mencakup pesanan berhasil dan gagal; remaining_count mencakup pesanan yang masih menunggu atau diproses.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
idstring · pathWajibUUID bulk dari POST /bulk-orders. Gunakan ID bulk, bukan buyer_bulk_id atau ID transaksi anak.
Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/bulk-orders/22222222-2222-4222-8222-222222222222' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:

Data dan progres pesanan bulk.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": {
    "id": "22222222-2222-4222-8222-222222222222",
    "buyer_bulk_id": "example-bulk-001",
    "sku_code": "EXAMPLE-10",
    "product_name": "Example product",
    "customer_target": "123456789",
    "customer_target_zone": "1234",
    "order_count": 3,
    "unit_price": 1000,
    "total_debit": 0,
    "status": "processing",
    "via": "api",
    "is_sandbox": true,
    "invoice_available": false,
    "created_at": "2026-10-02T03:00:00+00:00",
    "completed_at": null,
    "total_count": 3,
    "success_count": 1,
    "failed_count": 1,
    "processed_count": 2,
    "remaining_count": 1,
    "processing_count": 1,
    "queued_count": 0
  }
}

Transaksi anak bulk

GET/api/v1/h2h/bulk-orders/{id}/transactions

Pesanan anak diurutkan berdasarkan giliran, 15 per halaman. Setiap anak memiliki UUID transaksi dan buyer_trx_id sendiri.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
idstring · pathWajibUUID bulk dari POST /bulk-orders. Gunakan ID bulk, bukan buyer_bulk_id atau ID transaksi anak.
pageinteger · queryOpsionalNomor halaman, mulai dari 1.
Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/bulk-orders/22222222-2222-4222-8222-222222222222/transactions?page=1' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY"
Respons HTTP:
Contoh respons

Data dan progres pesanan bulk.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": {
    "current_page": 1,
    "data": [
      {
        "id": "11111111-1111-4111-8111-111111111111",
        "buyer_trx_id": "BULK-22222222-2222-4222-8222-222222222222-1",
        "bulk_order_id": "22222222-2222-4222-8222-222222222222",
        "buyer_bulk_id": "example-bulk-001",
        "bulk_sequence": 1,
        "sku_code": "EXAMPLE-10",
        "customer_target": "123456789",
        "customer_target_zone": "1234",
        "price": 1000,
        "status": "success",
        "serial_number": "EXAMPLE-SN-001",
        "error_code": null,
        "message": null,
        "created_at": "2026-10-02T03:00:00+00:00",
        "updated_at": "2026-10-02T03:00:00+00:00"
      }
    ],
    "first_page_url": "https://api.melostore.id/api/v1/h2h/bulk-orders/22222222-2222-4222-8222-222222222222/transactions?page=1",
    "from": 1,
    "last_page": 1,
    "last_page_url": "https://api.melostore.id/api/v1/h2h/bulk-orders/22222222-2222-4222-8222-222222222222/transactions?page=1",
    "links": [
      {
        "url": null,
        "label": "Previous",
        "active": false
      }
    ],
    "next_page_url": null,
    "path": "https://api.melostore.id/api/v1/h2h/bulk-orders/22222222-2222-4222-8222-222222222222/transactions",
    "per_page": 15,
    "prev_page_url": null,
    "to": 1,
    "total": 1
  }
}

Unduh invoice akhir bulk

GET/api/v1/h2h/bulk-orders/{id}/invoice

Unduh satu PDF yang merangkum biaya dan refund bulk yang selesai. HTTP 409 berarti invoice belum tersedia atau bulk menggunakan sandbox. Jika semua pesanan live gagal, invoice menunjukkan refund penuh dan biaya akhir nol.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
idstring · pathWajibUUID bulk dari POST /bulk-orders. Gunakan ID bulk, bukan buyer_bulk_id atau ID transaksi anak.
Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/bulk-orders/22222222-2222-4222-8222-222222222222/invoice' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY" \
  --fail-with-body --output bulk-invoice.pdf
Respons HTTP:

Lampiran PDF akhir dengan nomor invoice tetap H2H-BULK-{UUID}.

Content-Type: application/pdf · Content-Disposition: attachment

Billing pemeriksaan akun

Lihat GET /check-nickname/plan untuk jatah gratis dan tarif aktif. Pemeriksaan nickname dan purchase limit berbagi jatah. Hasil ditemukan maupun tidak ditemukan menggunakan jatah gratis, atau dikenakan biaya jika pemeriksaan berbayar aktif pada akun live. Setiap pemeriksaan ulang tetap menggunakan jatah atau biaya.

Hasil ditemukan dan tidak ditemukan memuat billing.charged_mc, free_remaining_today, dan transaction_id bila ditagih. Gangguan/verifikasi yang tidak pasti tidak disamakan dengan akun tidak ditemukan. HTTP 402 berarti saldo pemeriksaan tidak cukup; 429 kuota; 404 hasil tidak ditemukan; 422 validasi; 502 layanan belum tersedia. Mode sandbox akun hanya memakai jatah gratis.

Gunakan tarif dari respons plan terbaru sebelum menawarkan pemeriksaan berbayar. Jika tarif tidak tersedia, coba lagi sebelum melanjutkan. Angka pada contoh respons hanya ilustrasi; tarif aktif ditampilkan pada bagian paket pemeriksaan akun.

Paket pemeriksaan akun saat ini

…

Referensi zone adalah snapshot. Validasi kebutuhan zone melalui endpoint games dan gunakan kode zone sesuai game.

Referensi

Referensi kode zone

Pilih game untuk melihat kode yang digunakan pada customer_target_zone. Cari berdasarkan nama atau kode zone.

Game

Game/akun yang didukung

GET/api/v1/h2h/check-nickname/games

Daftar publik serta kebutuhan zone. Referensi zone docs merupakan snapshot.

Publik, tanpa autentikasi

Parameter

Tanpa parameter.

Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/check-nickname/games' \
  -H 'Accept: application/json'
Respons HTTP:

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "games": [
    {
      "game_code": "mobile-legends",
      "name": "Mobile Legends",
      "type": "game",
      "zone_required": true,
      "zone_values": null,
      "params": [
        {
          "name": "customer_target"
        },
        {
          "name": "customer_target_zone"
        }
      ],
      "status": "available"
    }
  ]
}

Paket pemeriksaan akun

GET/api/v1/h2h/check-nickname/plan

Jatah/tarif aktif publik. Angka contoh adalah snapshot fiktif, bukan tarif aktif.

Publik, tanpa autentikasi

Parameter

Tanpa parameter.

Contoh request
curl -X GET 'https://api.melostore.id/api/v1/h2h/check-nickname/plan' \
  -H 'Accept: application/json'
Respons HTTP:

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": {
    "free_daily_limit": 40,
    "free_minute_limit": 20,
    "paid_price_mc": 1,
    "paid_minute_limit": 20,
    "resets_at": "00:00 UTC"
  }
}

Periksa nama akun

POST/api/v1/h2h/check-nickname

Mode akun menentukan billing; tidak ada override sandbox per request. Ditemukan/tidak ditemukan memakai jatah atau biaya, termasuk pemeriksaan ulang.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
game_codestring · bodyWajibAmbil games[].game_code dari GET /check-nickname/games. Nilai ini berbeda dari slug brand produk. maxLength=100
customer_targetstring · bodyWajibID akun atau nomor pelanggan untuk pemeriksaan game/akun yang dipilih. Kirim sebagai string. maxLength=255
customer_target_zonestring | null · bodyOpsionalZone/server akun sesuai zone_required dan zone_values dari GET /check-nickname/games. Wajib untuk pemeriksaan batas pembelian Mobile Legends. maxLength=100
Contoh request
curl -X POST 'https://api.melostore.id/api/v1/h2h/check-nickname' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY" \
  -H 'Content-Type: application/json' \
  --data '{
  "game_code": "mobile-legends",
  "customer_target": "123456789",
  "customer_target_zone": "1234"
}'
Respons HTTP:
Contoh respons

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": {
    "game_code": "mobile-legends",
    "customer_target": "123456789",
    "customer_target_zone": "1234",
    "username": "Example Player",
    "region": "ID",
    "region_type": "country"
  },
  "billing": {
    "charged_mc": 0,
    "free_remaining_today": 39,
    "transaction_id": null
  }
}

Batas pembelian Mobile Legends

POST/api/v1/h2h/mobile-legends/purchase-limit

Endpoint pemeriksaan terpisah. Mengembalikan flag per paket; kegagalan bukan batas numerik. Berbagi jatah/billing nickname.

Dua header: X-API-Key dan X-Secret-Key

Parameter

NamaTipe / sumberWajibKeterangan
customer_targetstring · bodyWajibID akun atau nomor pelanggan untuk pemeriksaan game/akun yang dipilih. Kirim sebagai string. maxLength=255
customer_target_zonestring · bodyWajibZone/server akun sesuai zone_required dan zone_values dari GET /check-nickname/games. Wajib untuk pemeriksaan batas pembelian Mobile Legends. maxLength=100
Contoh request
curl -X POST 'https://api.melostore.id/api/v1/h2h/mobile-legends/purchase-limit' \
  -H 'Accept: application/json' \
  -H "X-API-Key: $H2H_API_KEY" \
  -H "X-Secret-Key: $H2H_SECRET_KEY" \
  -H 'Content-Type: application/json' \
  --data '{
  "customer_target": "123456789",
  "customer_target_zone": "1234"
}'
Respons HTTP:

Request berhasil.

HTTP 200 · Respons HTTP
{
  "success": true,
  "data": {
    "game_code": "mobile-legends",
    "customer_target": "123456789",
    "customer_target_zone": "1234",
    "username": "Example Player",
    "weekly_pass": {
      "limit_reached": false,
      "items": [
        {
          "package_code": "weekly-pass",
          "limit_reached": false
        }
      ]
    },
    "double_diamonds": {
      "eligible": true,
      "items": [
        {
          "package_code": "double-diamonds-50",
          "limit_reached": false
        }
      ]
    }
  },
  "billing": {
    "charged_mc": 0,
    "free_remaining_today": 39,
    "transaction_id": null
  }
}

Callback reguler, Smart, dan anak bulk

Masukkan hanya Webhook URL di dashboard. Webhook Secret dibuat otomatis bersama API Key dan Secret Key melalui Rotate Keys, ditampilkan sekali, lalu disimpan pada server penerima webhook. Setiap rotasi mengganti ketiganya; perbarui secret penerima agar verifikasi callback berikutnya tetap berhasil.

Callback hasil akhir dikirim pada success/failed; event transaction.action_change juga dapat dikirim saat processing. Pesanan yang dibuat manual melalui dashboard tidak mengirim callback. Untuk bulk, callback dikirim per transaksi; gunakan GET /bulk-orders/{id} untuk ringkasan progres. Callback yang sama dapat diterima lebih dari sekali.

Field umum: id, buyer_trx_id, sku_code, customer_target, customer_target_zone, price_charged, status, serial_number, is_sandbox, created_at, updated_at. Cocokkan callback dengan pesanan melalui id/buyer_trx_id. Pada Smart, simpan SKU yang dipesan dan baca fulfilled_sku_code untuk SKU yang berhasil dipenuhi. Harga memakai price pada respons transaksi dan price_charged pada callback; periksa saldo dan invoice untuk biaya akhir setelah refund.

Hanya Smart menambahkan max_bid, fulfilled_sku_code (null jika belum berhasil), attempts_count. Hanya anak bulk menambahkan bulk_order_id, buyer_bulk_id, bulk_sequence. Failed menambahkan error_code dan message jika tersedia. Tidak ada tambahan Smart/bulk pada callback reguler.

Verifikasi X-H2H-Signature sebagai hex HMAC-SHA256 terhadap raw body menggunakan webhook_secret. Simpan identitas event tindakan berdasarkan event_id dan versi, serta hasil akhir berdasarkan id:status sebelum merespons 2xx. Pastikan pengiriman ulang tidak memproses pesanan atau saldo dua kali. Contoh penerima lanjutan dapat dibuka di bawah; sesuaikan penyimpanan event dengan aplikasi Anda.

Contoh payload callback
{
  "id": "11111111-1111-4111-8111-111111111111",
  "buyer_trx_id": "example-order-001",
  "sku_code": "EXAMPLE-10",
  "customer_target": "123456789",
  "customer_target_zone": "1234",
  "status": "success",
  "serial_number": "EXAMPLE-SN-001",
  "is_sandbox": true,
  "created_at": "2026-10-02T03:00:00+00:00",
  "price_charged": 1000,
  "updated_at": "2026-10-02T03:00:00+00:00"
}

Import koleksi dan environment

Unduh OpenAPI 3.1.0 atau Postman Collection v2.1 serta environment template. Di Postman pilih Import file, import environment, lalu pilih environment tersebut. Isi api_key/secret_key dari hasil Generate/Rotate Keys; semua kredensial template kosong. Simpan webhook_secret dari modal yang sama pada server penerima callback. base_url menunjuk API, tanpa prefix locale.

Ambil katalog terlebih dahulu. Isi sku_code untuk reguler/bulk, smart_sku_code untuk Smart, customer_target, zone, dan additional_data sesuai inquiry. Set buyer_trx_id untuk reguler, smart_buyer_trx_id untuk Smart, dan buyer_bulk_id untuk bulk sekali per pesanan; script tidak menggantinya otomatis saat retry. Script create menyimpan transaction_id/bulk_order_id untuk request berikutnya. Buka daftar brand sesuai katalog; script menyimpan brand_id dan category_slug dari hasil pertama. Untuk 2FA, cek status pesanan yang benar terlebih dahulu agar action_buyer_trx_id, action_id, dan action_version terisi, lalu isi two_factor_code dari pembeli.

Folder callback hanya saved examples dan petunjuk penerima, tanpa request otomatis ke URL partner. Template webhook_secret digunakan untuk penerima callback, bukan header autentikasi API. Jangan menjalankan bulk invoice pada sandbox: endpoint akan memberikan 409. Untuk bulk live yang sudah final gunakan Send and Download pada endpoint invoice atau menu Bulk Order.